2015-09-01 3 views
0

У меня есть запрос, который отображает строки в наборах, каждый набор строк будет иметь две записи, идентифицированные 1 и 2. Это в основном время входа и выхода. Иногда пользователь будет пробивать данные несколько раз. Например, когда он пробивает «в», он может ударить его несколько раз, чтобы убедиться, но на самом деле он должен пробивать его только один раз. В то время как штамповки «выход», он может ударить его несколько раз, чтобы убедиться, но на самом деле он должен пробить его всего 1 раз. Время фиксируется для каждой записи. Мне нужно настроить следующий запрос, чтобы получить только первый раз или запись для нескольких записей. Если быть точнее, если в течение 5 минут имеется несколько записей, тогда отображается только первая запись, игнорирующая остальных в течение определенного 5-минутного периода.Отображение только первой записи для нескольких записей за 5 минут

SELECT TransactionID, TrDate, Time1, Tr_Serial, Port, UnitNo, UserPIN,Finger, 
     IP, UnitName, Tr_Description, 
     CASE WHEN ROW_NUMBER() OVER (PARTITION BY userpin, TrDate 
     ORDER BY trdate, time1) % 2 = 0 
     THEN '2' 
     ELSE '1' 
     END Tr_Type 
     FROM (
     SELECT row_number() OVER (
     ORDER BY datetime) TransactionID, cast([datetime] AS date) TrDate, cast(
     [datetime] AS time) Time1, [eventserial] Tr_Serial, '1' Port, [READERID] 
     UnitNo, [EVENTID] Tr_Type, [USERID] UserPIN, '1' Finger, 'NA' IP, [ 
     READERNAME] UnitName, [EVENTNAME] Tr_Description 
     FROM [BBC].[dbo].[BBC_LOG]) A 
     WHERE Tr_Type = 47 OR Tr_Type = 55 

Спасибо.

ответ

0
SELECT TransactionID, TrDate, MIN(Time1), Tr_Serial, Port, UnitNo, UserPIN,Finger, 
    IP, UnitName, Tr_Description, 
    CASE WHEN Min(ROW_NUMBER()) OVER (PARTITION BY userpin, TrDate 
    ORDER BY trdate, time1) % 2 = 0 
    THEN '2' 
    ELSE '1' 
    END Tr_Type 
    FROM (
    SELECT row_number() OVER (
    ORDER BY datetime) TransactionID, cast([datetime] AS date) TrDate, cast(
    [datetime] AS time) Time1, [eventserial] Tr_Serial, '1' Port, [READERID] 
    UnitNo, [EVENTID] Tr_Type, [USERID] UserPIN, '1' Finger, 'NA' IP, [ 
    READERNAME] UnitName, [EVENTNAME] Tr_Description 
    FROM [BBC].[dbo].[BBC_LOG]) A 
    WHERE Tr_Type = 47 OR Tr_Type = 55 

Попробуйте не уверен, что ваш выход, но я знаю, что вам нужно Min() на вашем DateTime, чтобы получить первую дату/время, то есть первый пользователь с тактовой частотой в с

Смежные вопросы