Eine Geige für meine Frage finden Sie unter https://dbfiddle.uk/?rdbms=postgres_10&fiddle=3cd9335fa07565960c1837aa65143685 .
Ich habe ein einfaches Tabellenlayout:
class
person: belongs to a class
Ich möchte alle Klassen auswählen und für jede Klasse möchte ich die ersten beiden Personenkennungen der zugehörigen Personen nach absteigendem Namen sortieren.
Ich habe dies mit der folgenden Abfrage gelöst:
select c.identifier, array_agg(p.identifier order by p.name desc) as persons
from class as c
left join lateral (
select p.identifier, p.name
from person as p
where p.class_identifier = c.identifier
order by p.name desc
limit 2
) as p
on true
group by c.identifier
order by c.identifier
Hinweis: Ich hätte eine Korrelationsunterabfrage in der SELECT
Klausel verwenden können, aber ich versuche, dies als Teil eines Lernprozesses zu vermeiden.
Wie Sie sehen, bewerbe ich mich order by p.name desc
an zwei Stellen:
- in der Unterabfrage
- in der Aggregatfunktion
Gibt es eine Möglichkeit, dies zu vermeiden? Mein Zug des Unterrichts:
Erstens kann ich das
order by
in der Unterabfrage natürlich nicht entfernen , da dies eine Abfrage ergeben würde, die meine oben angegebene Anforderung nicht erfüllt.Zweitens denke ich, dass die
order by
Funktion in der Aggregatfunktion nicht ausgelassen werden kann, da die Zeilenreihenfolge der Unterabfrage in der Aggregatfunktion nicht unbedingt beibehalten wird.
Soll ich die Abfrage umschreiben?
(identifier)
der Primärschlüssel von class
?