Ik weet dat dit een nogal oude vraag is, maar ik heb net een klein voorbeeld doorgenomen in mijn hoofd dat me hielp begrijpen waarom Postgres deze schijnbaar vreemde beperking heeft op SELECT DISTINCT / ORDER BY-kolommen.
Stel je voor dat je de volgende gegevens in je Rsvp-tabel hebt:
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
Nu wil je een lijst met verschillende event_ids pakken, geordend op hun respectievelijke start_times. Maar waar moet 1
Gaan? Moet het eerst komen, omdat de ene tupel op 1 januari 1970 begint, of moet het als laatste doorgaan vanwege de 21 augustus 2013?
Aangezien het databasesysteem die beslissing niet voor u kan nemen en de syntaxis van de query niet kan afhangen van de daadwerkelijke gegevens waarop deze mogelijk werkt (ervan uitgaande dat event_id
is uniek), zijn we beperkt tot het bestellen van alleen op kolommen uit de SELECT
clausule.
Wat betreft de eigenlijke vraag - een alternatief voor Matthew's antwoord is het gebruik van een aggregatiefunctie zoals MIN
of MAX
voor het sorteren:
SELECT event_id
FROM Rsvp
GROUP BY event_id
ORDER BY MIN(start_time)
De expliciete groepering en aggregatie op start_time
sta de database toe om met een eenduidige volgorde van de resultaat-tupels te komen. Merk echter op dat leesbaarheid in dit geval zeker een probleem is;)