* edit: Jeg bruker SQL Server 2012.
Jeg har en tabell som ser slik ut:
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 å få dette til den siste LogOutTime for hver id. Så vil jeg få den eldste LogOutTime ut av den gruppen .
Dette er posten jeg vil ha:
id LogOutTime ------------------------------ 7961 2017-11-21 09:26:48.507
Dette gir meg den siste LogOutTime for hver gruppe:
SELECT MAX(LogOutTime) AS MaxLogOut, id FROM table1 GROUP BY id
Dette gir meg datoen jeg vil ha:
SELECT MIN(table2.MaxLogout) FROM (SELECT MAX(LogOutTime) AS MaxLogOut, id FROM table1 GROUP BY id) AS table2
Jeg trenger å få ID og jeg » Jeg er ikke sikker på hvordan jeg skal gå frem og har ikke funnet et eksempel som er som mitt.
Kommentarer
- Hvilket DBMS er spørringen etter?
- Jeg har nettopp redigert koden min. Jeg la igjen i feil feltnavn, den skal være GROUP BY id. Takk.
Svar
Dette er ganske enkelt med en avledet 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")
Siden vi bare trenger den laveste verdien, vi kan velge topp 1 fra grupperingsspørringen, og bestille den etter 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 bruker SQL Server spesifikt, kan du sannsynligvis bruk OFFSET / FETCH (selv om 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åper dette hjelper!
Svar
Avhengig av DBMS, kan du bruke LIMIT 1
eller TOP 1
eller FETCH FIRST 1 ROWS ONLY
– i kombinasjon 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
Hei takk for alle svarene. Dette er hva jeg kom på etterpå 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
- Virker riktig, men litt overkomplisert.