* edit: Estoy usando SQL Server 2012.

Tengo una tabla que se ve así:

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 

Quiero obtener el último LogOutTime para cada ID. Luego, quiero obtener el LogOutTime más antiguo de ese grupo .

Este es el registro que quiero:

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

Esto me da el último LogOutTime para cada grupo:

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

Esto me da la fecha que quiero:

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

Necesito obtener la identificación y yo » No estoy seguro de cómo hacerlo y no he encontrado un ejemplo que sea como el mío.

Comentarios

  • ¿Para qué DBMS es la consulta?
  • Acabo de editar mi código. Dejé el nombre del campo incorrecto, debería ser GROUP BY id. Gracias.

Responder

Esto es bastante fácil con una tabla derivada.

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

Como solo necesitamos el valor más bajo, podemos seleccionar el primer 1 de la consulta de agrupación y ordenarlo por fecha ascendente.

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 no está utilizando SQL Server específicamente, probablemente pueda use OFFSET / FETCH (aunque esto funcionará en 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; 

¡Espero que esto ayude!

Respuesta

Dependiendo del DBMS, puede usar LIMIT 1 o TOP 1 o FETCH FIRST 1 ROWS ONLY – en combinación 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 ; 

Responder

Hola, gracias por todas las respuestas. Esto es lo que se me ocurrió después como solución.

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 ) 

Comentarios

  • Parece correcto pero un poco complicado.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *