* redigera: Jag använder SQL Server 2012.

Jag har en tabell som ser ut så här:

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 

Jag vill få den här senaste LogOutTime för varje id. Sedan vill jag få den äldsta LogOutTime ur den gruppen .

Detta är den post jag vill ha:

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

Detta ger mig den senaste LogOutTime för varje grupp:

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

Detta ger mig det datum jag vill ha:

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

Jag behöver få ID och jag ” jag är inte säker på hur jag ska gå tillväga och har inte hittat ett exempel som är som mitt.

Kommentarer

  • Vilket DBMS är frågan för?
  • Jag redigerade just min kod. Jag lämnade fel fältnamn, den ska vara GROUP BY id. Tack.

Svar

Detta är ganska enkelt med en härledd tabell.

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

Eftersom vi bara behöver det lägsta värdet, vi kan välja topp 1 från grupperingsfrågan och ordna den efter stigande datum.

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; 

Om du inte använder SQL Server specifikt kan du troligtvis använd OFFSET / FETCH (även om detta fungerar på 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; 

Hoppas det hjälper!

Svar

Beroende på DBMS kan du använda LIMIT 1 eller TOP 1 eller FETCH FIRST 1 ROWS ONLY – i kombination med 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 ; 

Svar

Hej tack för alla svar. Det här är vad jag kom på som en lösning.

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 ) 

Kommentarer

  • Verkar rätt men lite överkomplicerad.

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *