* edit: Estou usando o SQL Server 2012.

Eu tenho uma tabela que se parece com esta:

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 

Quero obter o LogOutTime mais recente para cada id. Em seguida, quero obter o LogOutTime mais antigo desse grupo .

Este é o registro que desejo:

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

Isso me dá o LogOutTime mais recente para cada grupo:

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

Isso me dá a data que desejo:

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

Preciso obter o ID e eu ” Não tenho certeza de como fazer isso e “não encontrei um exemplo parecido com o meu.

Comentários

  • Para qual DBMS é a consulta?
  • Acabei de editar meu código. Deixei o nome do campo incorreto, deveria ser GROUP BY id. Obrigado.

Resposta

Isso é muito fácil com uma tabela 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") 

Visto que precisamos apenas do valor mais baixo, podemos selecionar o primeiro da consulta de agrupamento e ordená-lo por 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 você não estiver usando o SQL Server especificamente, provavelmente poderá use OFFSET / FETCH (embora funcione no 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 ajude!

Resposta

Dependendo do DBMS, você pode usar LIMIT 1 ou TOP 1 ou FETCH FIRST 1 ROWS ONLY – em combinação com 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 ; 

Resposta

Olá, obrigado por todas as respostas. Foi isso que descobri depois como uma solução.

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 ) 

Comentários

  • Parece correto, mas um pouco complicado demais.

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *