* edit : I “m using SQL Server 2012.

다음과 같은 테이블 :

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 

각 ID에 대한 최신 LogOutTime을 얻고 싶습니다. 그런 다음 해당 그룹에서 가장 오래된 LogOutTime을 가져오고 싶습니다. .

원하는 레코드입니다.

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

각 그룹에 대한 최신 LogOutTime을 제공합니다.

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

원하는 날짜를 알려줍니다.

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

ID를 받아야합니다. 어떻게해야할지 모르겠고 “나와 같은 예를 찾지 못했습니다.

댓글

  • 어떤 DBMS에 대한 쿼리입니까?
  • 코드를 수정했습니다. 필드 이름을 잘못 입력했습니다. GROUP BY ID 여야합니다. 감사합니다.

답변

파생 된 테이블을 사용하면 매우 쉽습니다.

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

가장 낮은 값만 필요하므로 그룹화 쿼리에서 상위 1 개를 선택하고 날짜 오름차순으로 정렬 할 수 있습니다.

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; 

SQL Server를 특별히 사용하지 않는 경우 OFFSET / FETCH를 사용합니다 (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; 

도움이되기를 바랍니다!

답변

DBMS에 따라 LIMIT 1 또는 TOP 1 또는 FETCH FIRST 1 ROWS ONLYORDER 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 ; 

답변

안녕하세요. 모든 답변에 감사드립니다. 이것이 제가 해결책으로 생각 해낸 것입니다.

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 ) 

댓글

  • 올바른 것 같지만 약간 복잡합니다.

답글 남기기

이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다