我试图根据登录到会话的用户的数据编写一份报告。
我需要有一个完整的会议时间,从第一个人参加会议到最后一个人离开。
我希望它看起来如下:
这是我的疑问:
select vl.originalChatSessionID,
CONVERT(DATE, min(vl.ReceivedDateTime)) as VideoDate,
--CONVERT(TIME, min(vl.ReceivedDateTime)) as StartTime,
min(vl.ReceivedDateTime) as StartTime2,
--CONVERT(TIME, max(vl.ReceivedDateTime)) as EndTime,
max(vl.ReceivedDateTime) as EndTime2,
DATEDIFF(MINUTE, min(vl.ReceivedDateTime), max(vl.ReceivedDateTime)) as SessionLength
from iclickphrDxvideolog vl
--inner join iclickphrDxVideoHistory vh
-- on vl.originalChatSessionID = vh.meetingid
-- and vl.applicationUserID = vh.applicationUserID
where originalChatSessionID = @MeetingSessionID
--and (vl.logType = 'Initialize-Load Video chat Window' or vl.logType = 'Video Chat-End Chat')
group by originalChatSessionID
问题是,我在logType列中抓取第一个日志元素和最后一个日志元素,我知道这一点。如果我取消了where子句中的注释,其中写着;-和(vl.logType =‘初始化-加载视频聊天窗口’或vl.logType =‘视频聊天-结束聊天’),那么我对session....but的开始时间没有问题,会话结束时间有很大的问题。
下面是原始数据的图片:
发布于 2020-11-13 17:06:53
我假设originalChatSessionID
定义了一个唯一的会话。如果没有,则必须更改“分区BY”子句,以反映使其惟一的一列或多列。
这还假定ReceivedDateTime
是datetime
数据类型。
SELECT DISTINCT
vl.originalChatSessionID,
VideoDate = MIN(vl.ReceivedDateTime) OVER(PARTITION BY originalChatSessionID),
StartTime = MIN(ISNULL(sc.StartChat, vl.ReceivedDateTime)) OVER(PARTITION BY originalChatSessionID),
EndTime = MAX(ISNULL(ec.EndChat, vl.ReceivedDateTime)) OVER(PARTITION BY originalChatSessionID),
SessionLength = DATEDIFF(
minute,
MIN(ISNULL(sc.StartChat, vl.ReceivedDateTime)) OVER(PARTITION BY originalChatSessionID),
MAX(ISNULL(ec.EndChat, vl.ReceivedDateTime)) OVER(PARTITION BY originalChatSessionID)
)
FROM iclickphrDxvideolog vl
LEFT JOIN (
SELECT originalChatSessionID, StartChat = MIN(ReceivedDateTime)
WHERE logType = 'Initialize-Load Video chat Window'
GROUP BY originalChatSessionID
) sc ON vl.originalChatSessionID = sc.originalChatSessionID
LEFT JOIN (
SELECT originalChatSessionID, EndChat = MAX(ReceivedDateTime)
WHERE logType = 'Video Chat-End Chat'
GROUP BY originalChatSessionID
) ec ON vl.originalChatSessionID = ec.originalChatSessionID
这是未经测试的,因为我没有时间重新创建您的数据集。如果您需要更多的帮助,我建议您发布一个脚本来重新创建您的示例数据,以便人们可以使用它进行测试。
上面使用两个子查询,一个用于获取Initialize-Load Video chat Window
的第一个实例,另一个用于获取Video Chat-End Chat
的最后一个实例。我已经对这些LEFT JOIN
进行了修改,因此它们将返回NULL
值,但什么也找不到。在查询的主要部分,我使用ISNULL()
测试是否找到开始记录,然后为会话使用最早的记录,如果找不到结束记录,则使用会话的最后一个记录。
注意到没有分组,但我使用了
DISTINCT
来获得类似的结果。这个SQL语句没有WHERE子句,因此您可以从它创建一个视图,然后简单地为报表使用该视图和WHERE子句。
https://stackoverflow.com/questions/64829700
复制相似问题