Datensätze gruppiert sortieren

christophh

Neuer Benutzer
Beiträge
2
Guten Tag,
ist es möglich gruppiert zu sortieren?
Ich versuche es an einem Beispiel zu erklären:

Ausgangstabelle:

IDNameAnwesend am
1Theo02.03.2023
1Theo16.03.2023
2Elke12.02.2023
2Elke14.04.2023
3Gerd26.02.2023
4Anke18.03.2023

Ich möchte absteigend nach dem Anwesenheitsdatum sortieren, aber gleichzeitig alle Datensätze einer ID untereinander stehen haben. Würde heißen:

Oben steht Elke mit der Anwesenheit am 14.04.
Dann kommen erstmal alle weiteren Anwesenheiten von Elke (in diesem Fall nochmal am 12.02)
Von den verbleibenden ist Anke dann die mit dem "höchsten" Anwesenheitsdatum, usw....


IDNameAnwesend am
2Elke14.04.2023
2Elke12.02.2023
4Anke18.03.2023
1Theo16.03.2023
1Theo02.03.2023
3Gerd26.02.2023

Ist das mit SQL Mitteln möglich?
Viele Grüße
Christoph
 
Werbung:
Na klar. Ein Weg wäre ein Join auf das höchste Datum, z.B.:
Code:
SELECT tabelle.*
FROM tabelle
LEFT JOIN ( SELECT ID,max(datum) AS datum FROM tabelle GROUP BY ID ) t
ON tabelle.ID = t.ID
ORDER BY t.datum DESC, tabelle.Name
 
Die Beispieldatum sind zwar inkonsistent, also nicht sicher, ob ich das richtig verstanden habe, aber:
Ich würde zusätzlich auch noch nach tabelle.datum desc sortieren.
 
Kann mir das jemand ein wenig erklären?
Wie würde ich das in einem select umsetzen? Da fehlt mir leider noch der Ansatz.
Code:
postgres=# select * from christophh ;
 id | name |     d      
----+------+------------
  1 | theo | 2023-03-02
  1 | theo | 2023-03-16
  2 | elke | 2023-02-12
  2 | elke | 2023-04-14
  3 | gerd | 2023-02-26
  4 | anke | 2023-03-18
(6 rows)

postgres=# with foo as (select *, row_number() over (partition by id order by d desc) from christophh) select * from foo order by id, row_number;
 id | name |     d      | row_number 
----+------+------------+------------
  1 | theo | 2023-03-16 |          1
  1 | theo | 2023-03-02 |          2
  2 | elke | 2023-04-14 |          1
  2 | elke | 2023-02-12 |          2
  3 | gerd | 2023-02-26 |          1
  4 | anke | 2023-03-18 |          1
(6 rows)

postgres=#
 
Werbung:
ROW_NUMBER() dürfte hier nicht gehen wenn ich die Frage richtig verstanden habe. Es sortiert ja nur innerhalb eines jeden Blocks aber nicht die Blöcke an sich (nach max(datum)). Aber richtig, in meinem Beispiel fehlt noch ein drittes Kriterium im ORDER BY.
Code:
SELECT tabelle.*
FROM tabelle
LEFT JOIN ( SELECT ID,max(datum) AS datum FROM tabelle GROUP BY ID ) t
ON tabelle.ID = t.ID
ORDER BY t.datum DESC, tabelle.Name, tabelle.datum DESC
 
Zurück
Oben