Wiem, że to dość stare pytanie, ale właśnie przejrzałem w głowie mały przykład, który pomógł mi zrozumieć, dlaczego Postgres ma to pozornie dziwne ograniczenie w kolumnach SELECT DISTINCT / ORDER BY.
Wyobraź sobie, że masz w tabeli Rsvp następujące dane:
event_id | start_time
----------+------------------------
0 | Mar 17, 2013 12:00:00
1 | Jan 1, 1970 00:00:00
1 | Aug 21, 2013 16:30:00
2 | Jun 9, 2012 08:45:00
Teraz chcesz pobrać listę różnych identyfikatorów zdarzeń, uporządkowanych według odpowiednich czasów rozpoczęcia. Ale gdzie powinien 1
? iść? Czy powinien pojawić się jako pierwszy, ponieważ jedna krotka zaczyna się 1 stycznia 1970 roku, czy też powinien być ostatni z powodu 21 sierpnia 2013 roku?
Ponieważ system bazy danych nie może podjąć tej decyzji za Ciebie, a składnia zapytania nie może zależeć od rzeczywistych danych, na których może działać (zakładając, że event_id
jest unikalny), jesteśmy ograniczeni do zamawiania tylko według kolumn z SELECT
klauzula.
Jeśli chodzi o samo pytanie - alternatywą dla odpowiedzi Mateusza jest użycie funkcji agregującej, takiej jak MIN
lub MAX
do sortowania:
SELECT event_id
FROM Rsvp
GROUP BY event_id
ORDER BY MIN(start_time)
Wyraźne grupowanie i agregacja w start_time
zezwól bazie danych na jednoznaczną kolejność krotek wynikowych. Pamiętaj jednak, że czytelność jest zdecydowanie problemem w tym przypadku;)