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

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *