* edit: Jeg bruger m SQL Server 2012.

Jeg har en tabel, der ser sådan ud:

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 

Jeg ønsker at få dette til den nyeste LogOutTime for hvert id. Så vil jeg få den ældste LogOutTime ud af den gruppe .

Dette er den rekord, jeg vil have:

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

Dette giver mig den seneste LogOutTime for hver gruppe:

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

Dette giver mig den dato, jeg vil have:

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

Jeg har brug for at få idet og jeg ” Jeg er ikke sikker på, hvordan jeg skal gå videre og har ikke fundet et eksempel, der ligner mit.

Kommentarer

  • Hvilket DBMS er forespørgslen efter?
  • Jeg har lige redigeret min kode. Jeg har efterladt det forkerte feltnavn, det skal være GROUP BY id. Tak.

Svar

Dette er ret let med en afledt tabel.

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

Da vi bare har brug for den laveste værdi, Vi kan vælge top 1 fra grupperingsforespørgslen og bestille den efter stigende dato.

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; 

Hvis du ikke bruger SQL Server specifikt, kan du sandsynligvis brug OFFSET / FETCH (selvom dette fungerer 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; 

Håber det hjælper!

Svar

Afhængigt af DBMS kan du bruge 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 tak for alle svarene. Dette er hvad jeg kom op med efter 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

  • Synes korrekt, men lidt overkompliceret.

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *