* edit: I “m az SQL Server 2012 használatával.
így néz ki egy táblázat:
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
Szeretném megszerezni a legfrissebb LogOutTime-t minden egyes azonosítóhoz. Ezután a legrégebbi LogOutTime-t szeretném kihozni a csoportból .
Ez az a rekord, amire vágyom:
id LogOutTime ------------------------------ 7961 2017-11-21 09:26:48.507
Ez megadja nekem a legfrissebb LogOutTime-et minden csoport számára:
SELECT MAX(LogOutTime) AS MaxLogOut, id FROM table1 GROUP BY id
Ez megadja a kívánt dátumot:
SELECT MIN(table2.MaxLogout) FROM (SELECT MAX(LogOutTime) AS MaxLogOut, id FROM table1 GROUP BY id) AS table2
Meg kell szereznem az azonosítót és az I-t ” Nem tudom, hogyan tovább, és még nem találtam olyan példát, amely hasonló lenne az enyémhez.
Megjegyzések
- Melyik DBMS a lekérdezés?
- nemrég szerkesztettem a kódomat. A helytelen mezőnévben hagytam, a GROUP BY azonosítónak kell lennie. Köszönöm.
Válasz
Ez egy származtatott táblával nagyon egyszerű.
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")
Mivel éppen a legalacsonyabb értékre van szükségünk, kiválaszthatjuk az első 1-et a csoportosítási lekérdezésből, és dátum szerint növekvő sorrendbe rendezhetjük.
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;
Ha nem kifejezetten az SQL Server rendszert használja, akkor valószínűleg használja az OFFSET / FETCH parancsot (bár ez az SQL Server 2012+ rendszeren is működik).
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;
Remélem, hogy ez segít!
Válasz
A DBMS-től függően használhatja a LIMIT 1
vagy TOP 1
vagy FETCH FIRST 1 ROWS ONLY
– a ORDER BY MaxLogOut
kombinációban:
-- 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 ;
Válasz
Szia köszönöm a válaszokat. Ezt találtam ki megoldásként.
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 )
Megjegyzések
- Helyesnek tűnik, de kissé túlbonyolított.