【问题标题】:Unable to figure out accurate query to get timestamps for my report无法找出准确的查询来获取我的报告的时间戳
【发布时间】:2020-11-14 00:25:27
【问题描述】:

我正在尝试根据登录会话的用户数据编写报告。

我需要能够获得从第一个人加入会议到最后一个人离开的完整会话时间。

  • 当有人加入会议时,会记录为“初始化-加载视频聊天窗口”
  • 有 2 种方法可以关闭会议,但有一种方法正在记录。 - 有一个用户可以使用的“结束聊天”按钮,记录为“视频聊天-结束聊天” - 如果用户不使用该按钮而只是退出程序/浏览器,则数据库不会记录它,我想使用 logType 列中最后记录的元素。

我希望它如下所示:

这是我的查询:

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 子句中所说的部分; --and (vl.logType = 'Initialize-Load Video chat Window' or vl.logType = 'Video Chat-End Chat'),那么我对会话的开始时间没有问题....但是有会话结束时间的一个大问题。

下图是原始数据的样子:

【问题讨论】:

  • 您可能应该查看一些partition over 查询和/或子查询。
  • 您说您当前的方法存在问题,其中第二个“where 条件”被评论,但您没有说明为什么该方法不可接受/它有什么问题。据我了解您的问题,您正在尝试获取特定呼叫的最早和最新活动,而这种方法似乎可以满足这一点。
  • @GB 我提到当我从 where 条件中取消注释时,结束时间会变得混乱。因为如果我在数据库中没有“视频聊天结束聊天”日志,它不会抓取 logType 列中的最后一项,因为我只通过“初始化加载视频聊天窗口”和“视频”过滤该列聊天结束聊天”....但这会破坏 EndTime。这有意义吗?
  • @Marc 我试图做一个子查询但失败了。我是 sql 新手,所以想弄清楚。我从来没有使用过分区。你能解释一下如何使用它吗?
  • 您是否正在尝试获取特定呼叫的最早和最新活动?如果是,您当前的查询(忘记注释位)似乎可以做到这一点。我错过了什么?

标签: sql reporting-services timestamp reportbuilder3.0


【解决方案1】:

我假设originalChatSessionID 定义了一个独特的会话。如果不是,那么您将不得不更改“PARTITION BY”子句以镜像使其唯一的一个或多个列。

这也假设ReceivedDateTimedatetime 数据类型

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 JOINed 这些,所以他们将返回 NULL 值是什么都找不到。在查询的主要部分,我使用ISNULL() 来测试是否没有找到开始记录,然后使用最早的记录进行会话,如果没有找到结束记录,则使用最后的记录进行会话。

请注意,没有分组,但我使用DISTINCT 来获取 类似的结果。此 SQL 语句没有 WHERE 子句,因此您 可以从中创建一个视图,然后只需将该视图与 WHERE 一起使用 报告的条款。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-07-17
  • 2018-08-16
  • 2023-03-09
  • 2018-02-06
  • 1970-01-01
  • 2010-11-17
  • 1970-01-01
相关资源
最近更新 更多