2013-06-05 16 views
7

Korzystając libpq na PG 9.1 Próbuję napisać kwerendę, aby uzyskać wartości z rzędu z najwyższym indeksem 'my_id':PostgreSQL, wybierz z max id

SELECT my_id, col2, col3 
FROM mytable 
WHERE my_id = MAX(my_id) 

to daje mi błąd:

ERROR: aggregates not allowed in WHERE clause...

Jak poprawnie napisać takie zapytanie?

Odpowiedz

19

Jeśli twoim celem jest, aby wiersz z najwyższą wartością my_id, wówczas następujące zapytanie powinno osiągnąć ten sam cel.

SELECT my_id, col2, col3 
FROM mytable 
ORDER BY my_id DESC 
LIMIT 1 
+0

To wszystko, dziękuję. Mogę zaakceptować tylko jeden (najszybszy), ale wszystkie odpowiedzi pomogły, przepraszam. –

2
SELECT my_id, col2, col3 FROM mytable WHERE my_id = (select MAX(my_id) FROM mytab) 

lub użyj

SELECT my_id, col2, col3 FROM mytable ORDER BY my_id DESC LIMIT 1 
5

Wystarczy zamówienie przez my_id i podjąć tylko pierwszy rekord limit 1

SELECT my_id, col2, col3 
FROM mytable 
order by my_id desc 
limit 1 

Innym, ale mniej wydajnych sposobem byłoby

SELECT my_id, col2, col3 
FROM mytable 
where my_id = (select max(my_id) from mytable) 
4

Sub kwerendy mogą pomóc

SELECT my_id, col2, col3 FROM mytable WHERE my_id = (select MAX(my_id) FROM mytable) 
0

, gdy masz indeks na my_id, te z podzapytaniem powinny być szybsze. kiedy nie masz indeksu weź "zamówienie przez". (zależnie od rozmiaru bazy danych)

+0

Prawdopodobnie na odwrót. Postgres optymalizuje zapytania "LIMIT 1", w których indeks ma zastosowanie. –

Powiązane problemy