* 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.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.