2011-09-27 4 views
1

나는 테이블이 : 나는, 사용자 ID가 무리에 대한 날짜가 될 것이다 최신 이벤트를 얻을 수있는 쿼리를 작성해야SQL 서버 행은

EventLog (
    EventID (INT), 
    UserID (VARCHAR(50), 
    Event (NTEXT), 
    EventDate(DateTime), 
    DocuvmentID(INT) 
) 

WHERE UserID IN ('john','tom'...etc) 

방법 그걸 할 수 있을까요? 간단한 CTE와

+0

그냥 명확히하기 위해 - SQL에 쉼표로 구분 된 사용자 ID 목록이 전달되며이 사용자 각각에 대한 최신 이벤트를 찾으십니까? –

답변

2
SELECT y.UserID, y.Event, y.EventDate 
    FROM (SELECT UserId, MAX(EventDate) AS MaxDate 
       FROM YourTable 
       WHERE UserId IN ('john','tom',...) 
       GROUP BY UserId) t 
     INNER JOIN YourTable y 
      ON t.UserId = y.UserId 
       AND t.MaxDate = y.EventDate 
0
 select 
      UserID, 
      MAX(EventDate) AS LatestEventDate 
     from 
      EventLog 
     where 
      UserID in ('john','tom') 
     group by 
      UserID 
1

: 이것은 어떤 기준으로 데이터를 분할

;WITH LatestDates AS 
(SELECT 
    EventID, UserID, 
    Event, EventDate, 
    DocumentID, 
    ROW_NUMBER() OVER(PARTITION BY UserID ORDER BY EventDate DESC) AS 'RowNum' 
) 
SELECT * 
FROM LatestDates 
WHERE RowNum = 1 AND UserID IN (........) 

는 (I 옵션으로 UserID을 집어 - 당신을 위해 뭔가 다른 수 있습니다) 각 그룹 순차적으로 다음 숫자를 1에서 시작하여 다른 기준 (여기서는 EventDate DESC)으로 정렬 됨 - 따라서 각 "파티션"에 대한 가장 최근의 이벤트는 해당 CTE에서 선택하는 RowNum = 1입니다.