SQL:登录和注销表并插入注销

时间:2018-05-22 15:41:36

标签: sql sql-server ssms

因此,我们有一个表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没有退出他们的系统,这在LOGOUT事件中留下了NULL,其中(因为我不知道另一种方式)强迫我使用ISNULL假设他们在下午5点离开。

有没有一种方法,即使使用临时表,我可以在同一天带一个LOGIN而不是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

以及每个之间的MINUTES,并再次假设他们在特定日期的下午5点(1700)离开,如果他们没有生成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 :(得分:0)

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
相关问题