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

Vélemény, hozzászólás?

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük