2013-05-26 3 views
1

로그인하는 사용자와 로그 아웃하는 사용자를 추적하는 테이블이 있습니다.SQL 로그인/로그 아웃 테이블

이 쿼리는 먼저 등 마지막 동작의 순서로 모든 레코드를 반환합니다. EventDesc은 다음과 같습니다 :

SELECT [entryid] 
     ,[index] 
     ,[sessionid] 
     ,[UserName] 
     ,[UserPublicIP] 
     ,[EntryDateTime] 
     ,[ServerIP] 
     ,[EventDesc] 
    FROM [DB].[dbo].[table] 
    order by EntryDateTime desc 

우리는 쿼리 현재 사용자가 로그인 반환

을 사용할 수있는 값이 필요합니다 세션 로그인 SUC :

Session Login Succeeded 
Session Logoff Succeeded 
Session reconnection succeeded 
Session has been disconnected 
Shell start notification received 
etc 

우리는 어떻게 마지막 EntryDesc이었다 행에서 사용자 이름의 (& 다른 열)을 나열 Q의 SQL 쿼리를 만들 수 있습니다 ceeded 또는 세션 재 연결에 기록 즉, 사용자가 성공

우리는 다음과 같이 쿼리에 의해 고유 & 그룹을 사용하여 시도했다

그러나 그들은 작동하지 않습니다. 참고로

Select * From [DB].[dbo].[table] Group By Username 
Select Distinct Username From [DB].[dbo].[table] 

가 : 행이 생성됩니다 테이블에 사용자 로그가있을 때마다 테이블이 생성되므로 쿼리는 해당 사용자 이름의 최신 행을 선택해야합니다.

답변

1

주어진 날짜 이전에 각 사용자의 마지막 레코드를 찾고 있습니다. 구문에서 SQL Server를 사용하고있는 것으로 추측합니다. 그렇다면 row_number()으로이 작업을 수행 할 수 있습니다. 당신이 가장 최근 항목을 원하는 경우

select count(*) 
from (select t.*, 
      row_number() over (partition by Username order by EntryDatetime desc) as seqnum 
     from t 
     where EntryDatetime < @Datetime -- <-- remove this for the most recent entries 
    ) t 
where seqnum = 1 and 
     EntryDesc in ('Session Login Succeeded', 'Session reconnection succeeded'); 

당신은 내부 where 절을 제거 할 수 있습니다 카운트를 얻을

select t.* 
from (select t.*, 
      row_number() over (partition by Username order by EntryDatetime desc) as seqnum 
     from t 
     where EntryDatetime < @Datetime 
    ) t 
where seqnum = 1; 

이를 집계하고 다음 쿼리는 지정된 날짜 전에 마지막 행을 얻는다 데이터 베이스.