* edit: I „m using SQL Server 2012.

Mám tabulka, která vypadá takto:

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 

Chci získat nejnovější LogOutTime pro každé ID. Pak chci získat nejstarší LogOutTime z této skupiny .

Toto je záznam, který chci:

id LogOutTime ------------------------------ 7961 2017-11-21 09:26:48.507 

Tím získáte nejnovější LogOutTime pro každou skupinu:

SELECT MAX(LogOutTime) AS MaxLogOut, id FROM table1 GROUP BY id 

Tím získáte datum, které chci:

SELECT MIN(table2.MaxLogout) FROM (SELECT MAX(LogOutTime) AS MaxLogOut, id FROM table1 GROUP BY id) AS table2 

Potřebuji získat ID a já “ Nejsem si jistý, jak na to, a nenašel jsem příklad, který by byl jako můj.

Komentáře

  • Kterého DBMS je dotaz?
  • Právě jsem upravil svůj kód. Nechal jsem název nesprávného pole, měl by to být identifikátor GROUP BY. Díky.

Odpovědět

S odvozenou tabulkou je to docela snadné.

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") 

Protože potřebujeme pouze nejnižší hodnotu, můžeme vybrat první 1 ze seskupovacího dotazu a seřadit jej podle data vzestupně.

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; 

Pokud nepoužíváte konkrétně SQL Server, pravděpodobně použijte OFFSET / FETCH (i když to bude fungovat na serveru 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; 

Doufám, že to pomůže!

Odpověď

V závislosti na DBMS můžete použít LIMIT 1 nebo TOP 1 nebo FETCH FIRST 1 ROWS ONLY – v kombinaci s 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 ; 

Odpověď

Ahoj, děkuji za všechny odpovědi. S tím jsem přišel jako řešení.

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 ) 

Komentáře

  • Vypadá to dobře, ale trochu překomplikované.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *