因此,我们有一个表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
返回:
这又好了,但是我们的一些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'
列出:
以下是整个字段列表:
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]
答案 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