sql - 使用规则计算会话中花费的时间
问题描述
假设基表包含有关客户在其应用会话期间执行的每个操作(每一行)的信息。当每个会话开始时,action='Show' 被记录,当用户结束会话时,action='Hide' 被记录。对于用户执行的任何其他操作,都以不同的操作名称记录在 Show 和 Hide 之间。不幸的是,没有 sessionID 列,这是我试图根据这些信息创建的。
请假设“显示”和“隐藏”这两个动作仅在会话开始和会话结束时发出。
有了给定的信息,我想通过为每个会话创建唯一的 sessionID(可以是数字或字符串)来总结数据,并记录在会话中花费的时间。
我正在使用 Redshift SQL,所以如果我可以使用 Redshift 中的任何特殊功能,请利用它。
解决方案
您可以尝试编写两个子查询并通过customer
一个为action = 'show'
,另一个为action = 'Hide'
。
然后join
按行号,表示时间开始和结束。
SELECT t1.customer,
t2.rn,
DATEDIFF(mins, t1.time,t2.time) spentTime
FROM (
SELECT *,
ROW_NUMBER() OVER(PARTITION BY customer ORDER BY time) rn
FROM bastTable
WHERE action = 'show'
) t1 JOIN (
SELECT *,
ROW_NUMBER() OVER(PARTITION BY customer ORDER BY time) rn
FROM bastTable
WHERE action = 'Hide'
) t2 on t1.rn = t2.rn and t1.customer = t2.customer
推荐阅读
- linux - Oracle Enterprise Linux 5/6 上的 .NET Core
- javascript - 尝试推送通知/Node.js 教程
- python - 基本过滤器返回一个空列表
- highcharts - 可以将 dataLabels 设置为在 HighCharts 中显示 xAxis 数据而不是 yAxis 数据吗?
- javascript - 两个集合之间的mongodb复杂查询
- c# - 如何使用来自 BluetoothDeviceInfo 的信息识别 HID 设备,反之亦然
- c# - 由 Fortify 标记的 Null Deference
- c++ - 如何仅在邻域中的非常大的图像上计算成对 L1 距离矩阵?
- c# - 彩色到单色转换
- python - ValueError:制作动画时对已关闭文件的 I/O 操作