Ich weiß, dass dies eine ziemlich alte Frage ist, aber ich bin gerade ein kleines Beispiel in meinem Kopf durchgegangen, das mir geholfen hat zu verstehen, warum Postgres diese scheinbar seltsame Einschränkung für SELECT DISTINCT / ORDER BY-Spalten hat.
Stellen Sie sich vor, Sie haben die folgenden Daten in Ihrer Rsvp-Tabelle:
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
Jetzt möchten Sie eine Liste mit unterschiedlichen event_ids abrufen, die nach ihren jeweiligen start_times geordnet sind. Aber wo sollte 1
gehen? Soll es an erster Stelle stehen, weil das eine Tupel am 1. Januar 1970 beginnt, oder soll es wegen des 21. August 2013 an letzter Stelle stehen?
Da das Datenbanksystem diese Entscheidung nicht für Sie treffen kann und die Syntax der Abfrage nicht von den tatsächlichen Daten abhängen kann, auf denen sie möglicherweise arbeitet (unter der Annahme von event_id
eindeutig ist), sind wir darauf beschränkt, nur nach Spalten aus SELECT
zu sortieren Klausel.
Was die eigentliche Frage betrifft - eine Alternative zu Matthews Antwort ist die Verwendung einer Aggregatfunktion wie MIN
oder MAX
für die Sortierung:
SELECT event_id
FROM Rsvp
GROUP BY event_id
ORDER BY MIN(start_time)
Die explizite Gruppierung und Aggregation auf start_time
erlauben der Datenbank, eine eindeutige Reihenfolge der Ergebnistupel zu finden. Beachten Sie jedoch, dass die Lesbarkeit in diesem Fall definitiv ein Problem darstellt;)