SQL: таблица входа и выхода и вставка выходов - PullRequest
0 голосов
/ 22 мая 2018

Итак, у нас есть таблица lds_user_log, в которой регистрируются входы и выходы из нашего CSR за день.Это нормально, и у меня есть сценарий, который рассчитан на то, чтобы получать данные о количестве минут, зарегистрированных в день для наших показателей:

IF OBJECT_ID('tempdb..#tmpLogins1') IS NOT NULL DROP TABLE #tmpLogins1
IF OBJECT_ID('tempdb..#tmpLogins') IS NOT NULL DROP TABLE #tmpLogins


SELECT  T1.[user], 
        T1.[user_group], 
        T1.event_Date, 
        isnull( MIN(T2.event_date),'2018-05-21 17:00:0') AS Date2, 
        DATEDIFF(minute, T1.event_Date,  isnull( MIN(T2.event_date),'2018-05-21 17:00:0')) AS minDiff

INTO #tmpLogins1

FROM    [LEADS].[dbo].[lds_User_log] T1
        LEFT JOIN [LEADS].[dbo].[lds_User_log] T2
            ON T1.[user_group]= T2.[user_group]
            AND T2.event_Date > T1.event_Date
            and t1.[user]=t2.[user]
            where t1.event_date>= @startdate
            --AND t2.event_date <= '2018-05-21 23:00:01'

GROUP BY T1.[user], T1.[user_group], T1.event_Date; 



select distinct [user],
user_group,
sum(minDiff) over (partition by [user]) as totMins
 INTO #tmpLogins
 from #tmpLogins1

Это возвращает:

Results 1

Что опять хорошо, но некоторые из наших CSR не выходят из своей системы, что оставляет NULL в событии LOGOUT, где (потому что я не знаю другого способа сделать это) вынуждает меняиспользовать ISNULL сверху, предполагая, что они уехали в 5 вечера.

Есть ли способ, что, даже используя временные таблицы, я могу взять пользователя, у которого есть LOGINUT, но нет LOGOUT на тот же день, и вставить его в временную таблицу LOGOUT?Это потому, что мы хотим иметь возможность запускать этот отчет в течение целой недели, и некоторые представители вернутся домой и никогда не выйдут из системы (просто закрыв браузер), а затем снова войдут в систему на следующий день, никогда не создавая событие LOGOUT.Но нам нужно это как

FRI - 1st LOGIN |  LAST LOGOUT
MON - 1st LOGIN |  LAST LOGOUT
TUE - 1st LOGIN |  LAST LOGOUT
WED - 1st LOGIN |  LAST LOGOUT
THU - 1st LOGIN |  LAST LOGOUT

и МИНУТЫ между каждым из них, и снова, если предположить, что они уехали в 17:00 в тот конкретный день, ЕСЛИ они не сгенерировали событие LOGOUT.

Когда я извлекаю все данные из таблицы для конкретного пользователя за вчерашний день.

select * 
from LEADS.[dbo].[lds_User_log]
where [USER] = 'gunnr' AND event_date > '2018-05-21 00:00:01'

Это список:

Results 2

А вот и весь список полей:

SELECT [user_log_id]
      ,[user]
      ,[event]
      ,[campaign_id]
      ,[event_date]
      ,[event_epoch]
      ,[user_group]
      ,[session_id]
      ,[server_ip]
      ,[extension]
      ,[computer_ip]
      ,[browser]
      ,[data]
      ,[phone_login]
      ,[server_phone]
      ,[phone_ip]
      ,[webserver]
      ,[login_url]
      ,[browser_width]
      ,[browser_height]
  FROM [LEADS].[dbo].[lds_User_log]

1 Ответ

0 голосов
/ 22 мая 2018
SELECT
  [user_group],
  [user],
  pivots.event_date,
  MIN(pivots.login)             AS first_login,
  CASE
    WHEN MAX(pivots.login) < MAX(pivots.logout)
      THEN MAX(pivots.logout)
      ELSE DATEADD(HOUR, 17, pivots.event_date)
  END
                               AS last_logout
FROM
  [LEADS].[dbo].[lds_User_log]
CROSS APPLY
(
  SELECT CAST(CAST(event_date AS DATE) AS DATETIME)       AS event_date,
         CASE WHEN event = 'LOGIN'  THEN event_date END   AS login,
         CASE WHEN event = 'LOGOUT' THEN event_date END   AS logout
)
  pivots
GROUP BY
  [user_group],
  [user],
  pivots.event_date

Или, более гибко ...

WITH
  augmented
AS
(
  SELECT
    *,
    ROW_NUMBER() OVER (PARTITION BY event_date_only,
                                    [user_group],
                                    [user]
                           ORDER BY event_date DESC
                      )
                        AS reverse_seq
  FROM
    [LEADS].[dbo].[lds_User_log]
  CROSS APPLY
  (
    SELECT CAST(CAST(event_date AS DATE) AS DATETIME)
  )
    AS date_only(event_date_only)
)
SELECT
    [user_group],
    [user],
    event_date_only,
    MIN(login)             AS first_login,
    MAX(logout)            AS last_logout
FROM
  augmented
CROSS APPLY
(
    SELECT CASE WHEN event = 'LOGIN'  THEN event_date END   AS login,
           CASE WHEN event = 'LOGOUT' THEN event_date END   AS logout

    UNION ALL

    -- Creates a "fake" logout if the last event of the day is a login
    SELECT NULL,
           DATEADD(HOUR, 17, event_date_only)
     WHERE reverse_seq = 1
       AND event = 'LOGIN'
)
  AS pivots
GROUP BY
  [user_group],
  [user],
  event_date_only
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...