* edit: folosesc SQL Server 2012.

Am un tabel care arată astfel:

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 

Vreau să obțin cel mai recent LogOutTime pentru fiecare id. Apoi vreau să obțin cel mai vechi LogOutTime din grupul respectiv .

Aceasta este înregistrarea pe care o doresc:

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

Aceasta îmi oferă cel mai recent LogOutTime pentru fiecare grup:

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

Acest lucru îmi dă data pe care o doresc:

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

Am nevoie să obțin ID-ul și eu ” Nu sunt sigur cum să fac acest lucru și nu am găsit un exemplu care să fie ca al meu.

Comentarii

  • Pentru ce SGBD este interogarea?
  • Tocmai mi-am editat codul. Am lăsat în numele câmpului incorect, ar trebui să fie GROUP BY id. Mulțumesc.

Răspunde

Acest lucru este destul de ușor cu un tabel derivat.

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

Deoarece avem nevoie doar de cea mai mică valoare, putem selecta topul 1 din interogarea de grupare și îl putem ordona în funcție de dată crescătoare.

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; 

Dacă nu utilizați în mod specific SQL Server, este posibil utilizați OFFSET / FETCH (deși acest lucru va funcționa pe 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; 

Sper că acest lucru vă va ajuta!

Răspuns

În funcție de SGBD, puteți utiliza LIMIT 1 sau TOP 1 sau FETCH FIRST 1 ROWS ONLY – în combinație cu 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 ; 

Răspuns

Bună mulțumire pentru toate răspunsurile. Aceasta este ceea ce am venit după aceea ca soluție.

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 ) 

Comentarii

  • Pare corect, dar puțin complicat.

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *