2013-05-26 7 views
1

У нас есть таблица, которая отслеживает вход и выход пользователей.Таблица входа/выхода SQL Таблица

Этот запрос возвращает все записи в порядке последнего действия первого и т.д.:

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

Нам нужен запрос, возвращающий текущие пользователи вошли в систему

Возможные значения:. EventDesc являются:

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

Как мы можем создать Q SQL запрос, который содержит список (& других столбцов) с именем пользователя от строк, последний EntryDesc был: Session Вход Suc ceeded или переподключение сеанса удалось т.е. пользователь, вошедший в

Мы попытались использовать Distinct & Group По запросу, таких как ниже, но они, кажется, не работает:.

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

FYI: Строка создается в таблица каждый раз, когда пользователь регистрируется в нашем и т. д., поэтому для запроса необходимо выбрать последнюю строку для указанного имени пользователя.

ответ

1

Вы ищете последнюю запись для каждого пользователя до указанной даты. Из вашего синтаксиса я собираюсь предположить, что вы используете SQL Server. Если это так, вы можете сделать это с помощью row_number(). Следующий запрос получает эту последнюю строку до указанной даты:

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; 

Чтобы объединить это и получить счет:

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 предложение, если вы хотите самую последнюю запись в файле база данных.