* edit: Jutilise SQL Server 2012.

Jai un tableau qui ressemble à ceci:

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 

Je veux obtenir le dernier LogOutTime pour chaque id. Ensuite, je veux obtenir le plus ancien LogOutTime de ce groupe .

Voici lenregistrement que je veux:

id LogOutTime ------------------------------ 7961 2017-11-21 09:26:48.507 

Cela me donne le dernier LogOutTime pour chaque groupe:

SELECT MAX(LogOutTime) AS MaxLogOut, id FROM table1 GROUP BY id 

Cela me donne la date que je veux:

SELECT MIN(table2.MaxLogout) FROM (SELECT MAX(LogOutTime) AS MaxLogOut, id FROM table1 GROUP BY id) AS table2 

Jai besoin dobtenir lID et je  » Je ne sais pas comment my prendre et je nai pas trouvé dexemple qui ressemble au mien.

Commentaires

  • Pour quel SGBD la requête est-elle destinée?
  • Je viens de modifier mon code. Jai laissé un nom de champ incorrect, il devrait sagir de GROUP BY id. Merci.

Réponse

Cest assez facile avec une table dérivée.

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") 

Puisque nous avons juste besoin de la valeur la plus basse, nous pouvons sélectionner le premier dans la requête de regroupement et le classer par date ascendante.

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; 

Si vous « nutilisez pas spécifiquement SQL Server, vous pouvez probablement utilisez OFFSET / FETCH (bien que cela fonctionne sur 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; 

Jespère que cela vous aidera!

Réponse

Selon le SGBD, vous pouvez utiliser LIMIT 1 ou TOP 1 ou FETCH FIRST 1 ROWS ONLY – en combinaison avec 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 ; 

Réponse

Salut merci pour toutes les réponses. Cest ce que jai trouvé après comme solution.

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 ) 

Commentaires

  • Semble correct mais un peu trop compliqué.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *