尝试在 clickhouse 中记录连续的时间戳条纹
Posted
技术标签:
【中文标题】尝试在 clickhouse 中记录连续的时间戳条纹【英文标题】:Trying to record consecutive timestamp streaks within clickhouse 【发布时间】:2021-10-12 23:56:09 【问题描述】:所以,我有一个存储用户 ID 和会话时间的表。我想获得每个用户的最大连胜记录。在 (streak_size) 周内每周至少进行 1 次裸奔
我的桌子是这样的:
create table sessions(userid String, session_ts DateTime)
Engine = MergeTree Order By(session_ts);
insert into sessions values
('user1','2020-12-13 00:00:00'),('user1','2020-12-20 00:00:00'),
('user1','2020-12-27 00:00:00'),('user1','2021-01-10 00:00:00'),
('user1','2021-01-17 00:00:00');
并将一行与下一行进行比较,以查看 userid 是否相等,并且一周是否正好相隔 1 周
问题是我不知道如何告诉它停止计数,或者在连续中断时重新开始计数
我希望我的输入看起来像:
[userid: user1, streak: 3]
【问题讨论】:
【参考方案1】:这是一个“差距和岛屿”的任务
SELECT
userid,
arrayMap(i -> length(i), arraySplit((x, y) -> (y > 1), arrayDifference(groupArray(weeknum)) AS x, x)) AS r,
arrayMax(r) AS r1
FROM
(
SELECT userid, toRelativeWeekNum(session_ts) weeknum FROM sessions ORDER BY userid, weeknum
)
GROUP BY userid
┌─userid─┬─r─────┬─r1─┐
│ user1 │ [3,2] │ 3 │
└────────┴───────┴────┘
【讨论】:
以上是关于尝试在 clickhouse 中记录连续的时间戳条纹的主要内容,如果未能解决你的问题,请参考以下文章
为啥将 OFFSET 添加到 clickhouse 查询会增加执行时间?