尝试在 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 中记录连续的时间戳条纹的主要内容,如果未能解决你的问题,请参考以下文章

Clickhouse 和 RabbitMQ 的连接问题

为啥将 OFFSET 添加到 clickhouse 查询会增加执行时间?

如何禁用 ClickHouse JDBC 的信息日志记录

clickhouse clickhouse配置查询记录query_log

为啥clickhouse写批记录慢?

如何为clickhouse创建索引?