* edit: sto usando SQL Server 2012.
Ho una tabella simile a questa:
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
Voglio ottenere lultimo LogOutTime per ogni ID. Quindi voglio ottenere il LogOutTime meno recente da quel gruppo .
Questo è il record che voglio:
id LogOutTime ------------------------------ 7961 2017-11-21 09:26:48.507
Questo mi dà lultimo LogOutTime per ogni gruppo:
SELECT MAX(LogOutTime) AS MaxLogOut, id FROM table1 GROUP BY id
Questo mi dà la data che desidero:
SELECT MIN(table2.MaxLogout) FROM (SELECT MAX(LogOutTime) AS MaxLogOut, id FROM table1 GROUP BY id) AS table2
Devo ottenere lID e io ” Non sono sicuro di come procedere e non ho trovato un esempio che sia come il mio.
Commenti
- Quale DBMS è la query per?
- Ho appena modificato il mio codice. Ho lasciato il nome del campo errato, dovrebbe essere GROUP BY id. Grazie.
Risposta
È abbastanza semplice con una tabella derivata.
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")
Poiché abbiamo solo bisogno del valore più basso, possiamo selezionare il primo 1 dalla query di raggruppamento e ordinarlo per data crescente.
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;
Se non stai utilizzando SQL Server in modo specifico, probabilmente puoi usa OFFSET / FETCH (anche se questo funzionerà su SQL Server 2012+).
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;
Spero che questo aiuti!
Risposta
A seconda del DBMS, puoi utilizzare LIMIT 1
o TOP 1
o FETCH FIRST 1 ROWS ONLY
– in combinazione con 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 ;
risposta
Ciao, grazie per tutte le risposte. Questo è ciò che mi è venuto in mente dopo come soluzione.
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 )
Commenti
- Sembra corretto ma un po troppo complicato.