* edit: Używam SQL Server 2012.

Mam tabela, która wygląda następująco:

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 

Chcę uzyskać najnowszy czas LogOutTime dla każdego identyfikatora. Następnie chcę pobrać najstarszy LogOutTime z tej grupy .

To jest rekord, który chcę:

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

To daje mi najnowszy czas LogOutTime dla każdej grupy:

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

To daje mi datę, którą chcę:

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

Muszę uzyskać identyfikator i ja ” Nie jestem pewien, jak się do tego zabrać i nie znalazłem przykładu podobnego do mojego.

Komentarze

  • Do którego DBMS jest zapytanie?
  • Właśnie dokonałem edycji kodu. Zostawiłem nieprawidłową nazwę pola, powinno to być GROUP BY id. Dzięki.

Odpowiedź

W przypadku tabeli pochodnej jest to całkiem proste.

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

Ponieważ potrzebujemy tylko najniższej wartości, możemy wybrać pierwsze 1 z zapytania grupującego i uporządkować je według rosnącej daty.

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; 

Jeśli nie używasz wyłącznie SQL Server, prawdopodobnie użyj OFFSET / FETCH (chociaż będzie to działać na 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; 

Mam nadzieję, że to pomoże!

Odpowiedź

W zależności od DBMS, możesz użyć LIMIT 1 lub TOP 1 lub FETCH FIRST 1 ROWS ONLY – w połączeniu z 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 ; 

Odpowiedź

Cześć, dziękuję za wszystkie odpowiedzi. Właśnie to wymyśliłem jako rozwiązanie.

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 ) 

Komentarze

  • Wydaje się poprawne, ale trochę zbyt skomplikowane.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *