* edit: Ich verwende SQL Server 2012.
Ich habe Eine Tabelle, die folgendermaßen aussieht:
id LogOutTime ------------------------------ 8563 2017-11-21 09:21:28.330 7961 2017-11-21 09:22:40.627 7961 2017-11-21 09:26:48.507 8563 2017-11-21 09:29:05.977
Ich möchte für jede ID die neueste LogOutTime erhalten. Dann möchte ich die älteste LogOutTime aus dieser Gruppe herausholen
Dies ist der Datensatz, den ich möchte:
id LogOutTime ------------------------------ 7961 2017-11-21 09:26:48.507
Dies gibt mir die neueste LogOutTime für jede Gruppe:
SELECT MAX(LogOutTime) AS MaxLogOut, id FROM table1 GROUP BY id
Dies gibt mir das gewünschte Datum:
SELECT MIN(table2.MaxLogout) FROM (SELECT MAX(LogOutTime) AS MaxLogOut, id FROM table1 GROUP BY id) AS table2
Ich muss die ID erhalten und ich “ Ich bin mir nicht sicher, wie ich vorgehen soll, und habe kein Beispiel gefunden, das meinem ähnelt.
Kommentare
- Für welches DBMS wird abgefragt?
- Ich habe gerade meinen Code bearbeitet. Ich habe den falschen Feldnamen hinterlassen. Er sollte GROUP BY id sein. Danke.
Antwort
Dies ist mit einer abgeleiteten Tabelle ziemlich einfach.
CREATE TABLE #thing (id INT, dateval DATETIME) INSERT #thing ( id, dateval ) VALUES (8563, "2017-11-21 09:21:28.330"), (7961, "2017-11-21 09:22:40.627"), (7961, "2017-11-21 09:26:48.507"), (8563, "2017-11-21 09:29:05.977")
Da wir nur den niedrigsten Wert benötigen, Wir können die Top 1 aus der Gruppierungsabfrage auswählen und nach aufsteigendem Datum sortieren.
SELECT TOP 1 * FROM ( SELECT t.id, MAX(t.dateval) AS max_date FROM #thing AS t GROUP BY t.id ) AS x ORDER BY x.max_date;
Wenn Sie SQL Server nicht speziell verwenden, können Sie dies wahrscheinlich tun Verwenden Sie OFFSET / FETCH (obwohl dies unter SQL Server 2012+ funktioniert).
SELECT * FROM ( SELECT t.id, MAX(t.dateval) AS max_date FROM #thing AS t GROUP BY t.id ) AS x ORDER BY x.max_date OFFSET 0 ROWS FETCH NEXT 1 ROWS ONLY;
Hoffe, dies hilft!
Antwort
Abhängig vom DBMS können Sie LIMIT 1
oder TOP 1
oder verwenden FETCH FIRST 1 ROWS ONLY
– in Kombination mit ORDER BY MaxLogOut
:
-- standard SQL, Postgres, SQL Server 2012+ SELECT MAX(LogOutTime) AS MaxLogOut, id FROM table1 GROUP BY id ORDER BY MaxLogOut OFFSET 0 ROWS FETCH FIRST 1 ROWS ONLY ; -- SQL Server SELECT TOP (1) MAX(LogOutTime) AS MaxLogOut, id FROM table1 GROUP BY id ORDER BY MaxLogOut ; -- MySQL SELECT MAX(LogOutTime) AS MaxLogOut, id FROM table1 GROUP BY id ORDER BY MaxLogOut LIMIT 1 ;
Antwort
Hallo, danke für alle Antworten. Dies ist, was ich als Lösung gefunden habe.
SELECT * FROM ( SELECT MAX(LogOutTime) AS MaxLogOut, id FROM table1 GROUP BY id ) AS table2 WHERE MaxLogOut = (SELECT MIN(MaxLogOut) FROM ( SELECT MAX(LogOutTime) AS MaxLogOut, id FROM table1 GROUP BY id) AS table3 )
Kommentare
- Scheint aber richtig etwas überkompliziert.