SQL记录配对和时间间隔计算
我想计算具体记录的时间间隔。 这是我的SQL查询和记录SQL记录配对和时间间隔计算,sql,amazon-redshift,Sql,Amazon Redshift,我想计算具体记录的时间间隔。 这是我的SQL查询和记录 select event_timestamp, item_id from my_table where event_type='item_clicked' and (item_id='btnA' or item_id='btnB') and user_id='5afcd689c926dc6b1573d7cbff23aa7e' order by event_timestamp DESC event_timestamp item_id 201
select event_timestamp, item_id from my_table where event_type='item_clicked' and (item_id='btnA' or item_id='btnB') and user_id='5afcd689c926dc6b1573d7cbff23aa7e' order by event_timestamp DESC
event_timestamp item_id
2018-08-08 12:39:56 btnA
2018-08-08 12:37:26 btnB
2018-08-08 12:37:09 btnA
2018-08-08 12:36:41 btnB
2018-08-08 12:34:06 btnA
2018-08-08 12:33:56 btnB
2018-08-08 12:30:32 btnB
2018-08-08 12:29:55 btnB
2018-07-13 01:48:17 btnB
2018-07-12 03:31:07 btnA
2018-07-12 01:52:50 btnB
2018-07-11 17:01:56 btnA
2018-07-11 16:32:16 btnA
2018-07-09 06:56:49 btnB
但是,我想计算不同item_id状态更改的时间间隔
例如,我想知道当用户单击btnA时,他/她将在多长时间后单击btnB。
如何通过SQL查询生成这样的表?
from_item_id to_item_id total_seconds average_seconds
btnA btnB 112256 28064
[Note]
2018/7/11 5:01:56 PM -> 2018/7/12 1:52:50 AM: 31854 seconds
2018/7/12 3:31:07 AM -> 2018/7/13 1:48:17 AM: 80230 seconds
2018/8/8 12:34:06 PM -> 2018/8/8 12:36:41 PM: 155 seconds
2018/8/8 12:37:09 PM -> 2018/8/8 12:37:26 PM: 17 seconds
And the total seconds is 112256, and the average is 28064.
在子查询中时,您可以尝试将
LEAD
窗口函数与CASE一起使用
然后使用聚合函数sum
和count
获得结果
CREATE TABLE my_table(
event_timestamp TIMESTAMP,
item_id VARCHAR(50)
);
INSERT INTO my_table VALUES ('2018-08-08 12:39:56','btnA');
INSERT INTO my_table VALUES ('2018-08-08 12:37:26','btnB');
INSERT INTO my_table VALUES ('2018-08-08 12:37:09','btnA');
INSERT INTO my_table VALUES ('2018-08-08 12:36:41','btnB');
INSERT INTO my_table VALUES ('2018-08-08 12:34:06','btnA');
INSERT INTO my_table VALUES ('2018-08-08 12:33:56','btnB');
INSERT INTO my_table VALUES ('2018-08-08 12:30:32','btnB');
INSERT INTO my_table VALUES ('2018-08-08 12:29:55','btnB');
INSERT INTO my_table VALUES ('2018-07-13 01:48:17','btnB');
INSERT INTO my_table VALUES ('2018-07-12 03:31:07','btnA');
INSERT INTO my_table VALUES ('2018-07-12 01:52:50','btnB');
INSERT INTO my_table VALUES ('2018-07-11 17:01:56','btnA');
INSERT INTO my_table VALUES ('2018-07-11 16:32:16','btnA');
INSERT INTO my_table VALUES ('2018-07-09 06:56:49','btnB');
查询#1
SELECT 'btnA' from_item_id,
'btnB' to_item_id,
sum(secondDiff) total_seconds,
sum(secondDiff) / COUNT(*) average_seconds
FROM (
SELECT *,
(CASE WHEN item_id = 'btnA'
and
LEAD(item_id) OVER(ORDER BY event_timestamp) = 'btnB'
THEN extract(epoch from (LEAD(event_timestamp) OVER(ORDER BY event_timestamp )- event_timestamp))
ELSE 0 END) secondDiff
FROM my_table
) t1
WHERE seconddiff > 0;
| from_item_id | to_item_id | total_seconds | average_seconds |
| ------------ | ---------- | ------------- | --------------- |
| btnA | btnB | 112256 | 28064 |
我将使用条件累积最小值来计算下一个b事件时间。这似乎是最简单的方法:
select user_id,
'btnA' from_item_id,
'btnB' to_item_id,
sum(datediff(second, event_timestamp, next_b)) as total_seconds,
avg(datediff(second, event_timestamp, next_b)) as average_seconds
from (select t.*,
min(case when item_id = 'btnB' then event_timestamp end) over (partition by user_id order by event_timestamp desc) as next_b
from my_table t
) t
where item_id = 'btnA'
group by user_id;
您的dbms是什么?@D-Shih我们使用亚马逊红移,所以它似乎是基于PostgreSQL 8.0.2。您如何创建总秒数
和平均秒数
,计算顺序是desc还是asc?我计算的总秒数应该是另一个数字,你能解释一下吗?谢谢。@D-Shih抱歉我弄错了,我已经编辑过了。谢谢你的提及!到目前为止你试过什么?你知道窗口的功能吗?我建议您将postgresql标记作为postgres redshiftYes删除,这对我很有用。非常感谢你。目前,我尝试编辑SQL查询以满足我的其他目的。这是我可以参考的黄金样本。非常感谢@安迪:没问题,很乐意帮忙:)我尝试在表中添加user_id列。此外,我想列出每个用户的总秒数和平均秒数。因此,我首先修改子查询部分,并尝试首先满足相同的用户id记录。然而,在我的真实世界数据库中,似乎只有一部分案例是有效的。你能给我一些提示吗?谢谢!!这是我的DB提琴:@Andy您可以尝试在窗口函数中使用按用户id划分。谢谢!!!但是,它在db fiddle中工作,但在我的真实环境中不工作(secondDiff都是零)。我正在检查这两种环境之间的区别…非常感谢!!我将更改表名以尝试此操作!!我已经修改了表名,但它似乎不起作用。。。。你能帮我查一下吗?db fiddle使用Postgres,它不支持datediff()
。然而,亚马逊红移确实如此。