* edit: ik gebruik SQL Server 2012.
Ik heb een tabel die er als volgt uitziet:
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
Ik wil dit de laatste LogOutTime voor elke id krijgen. Dan wil ik de oudste LogOutTime uit die groep halen .
Dit is het record dat ik wil:
id LogOutTime ------------------------------ 7961 2017-11-21 09:26:48.507
Dit geeft me de laatste LogOutTime voor elke groep:
SELECT MAX(LogOutTime) AS MaxLogOut, id FROM table1 GROUP BY id
Dit geeft me de gewenste datum:
SELECT MIN(table2.MaxLogout) FROM (SELECT MAX(LogOutTime) AS MaxLogOut, id FROM table1 GROUP BY id) AS table2
Ik moet de ID krijgen en ik ” Ik weet niet zeker hoe ik het moet aanpakken en heb “geen voorbeeld gevonden dat lijkt op het mijne.
Opmerkingen
- Voor welk DBMS is de vraag?
- Ik heb zojuist mijn code bewerkt. Ik heb de veldnaam verkeerd ingevuld, het zou GROUP BY id moeten zijn. Bedankt.
Antwoord
Dit is vrij eenvoudig met een afgeleide 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")
Aangezien we alleen de laagste waarde nodig hebben, we kunnen de top 1 uit de groepeervraag selecteren en deze sorteren op oplopende 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;
Als u SQL Server niet specifiek gebruikt, kunt u waarschijnlijk gebruik OFFSET / FETCH (hoewel dit zal werken op 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;
Ik hoop dat dit helpt!
Antwoord
Afhankelijk van het DBMS kunt u LIMIT 1
of TOP 1
gebruiken of FETCH FIRST 1 ROWS ONLY
– in combinatie met 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 ;
Answer
Hallo bedankt voor alle antwoorden. Dit is wat ik zocht als een oplossing.
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 )
Reacties
- Lijkt correct, maar een beetje te ingewikkeld.