* edit: I ”m SQL Server 2012: n avulla.

Minulla on taulukko, joka näyttää tältä:

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 

Haluan saada tämän viimeisimmän LogOutTime-ajan jokaiselle tunnukselle. Sitten haluan saada vanhimman LogOutTime-ryhmän tästä ryhmästä. .

Tämän haluan tietueen:

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

Tämä antaa minulle viimeisimmän LogOutTime-ajan jokaiselle ryhmälle:

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

Tämä antaa minulle haluamasi päivämäärän:

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

Minun täytyy saada tunnus ja minä ” En ole varma, miten edetä, enkä ole löytäneet minun kaltaista esimerkkiä.

Kommentit

  • Minkä DBMS: n kysely on?
  • muokkain juuri koodiani. Jätin väärän kentän nimen, sen pitäisi olla GROUP BY -tunnus. Kiitos.

Vastaa

Tämä on melko helppoa johdetun taulukon kanssa.

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

Koska tarvitsemme vain pienimmän arvon, Voimme valita ryhmäkyselystä ylin 1 ja järjestää sen päivämäärän mukaan nousevassa järjestyksessä.

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; 

Jos et käytä nimenomaan SQL Serveriä, voit todennäköisesti käytä OFFSET / FETCH (vaikka tämä toimii SQL Server 2012+: ssa).

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; 

Toivottavasti tämä auttaa!

Vastaus

DBMS: stä riippuen voit käyttää LIMIT 1 tai TOP 1 tai FETCH FIRST 1 ROWS ONLY – yhdessä 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 ; 

Vastaa

Hei kiitos kaikista vastauksista. Tämän keksin ratkaisuksi.

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 ) 

Kommentit

  • Näyttää oikealta, mutta hieman liian monimutkainen.

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *