* 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.

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *