You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在现代SQL中实现时间戳的时序聚类?

现代SQL实现时间戳聚类(连续近邻时间分组)

可以实现,这类需求属于时间序列会话化分组,核心是把间隔在设定阈值内的时间戳归为同一组,最终提取每组的起止时间。

假设你的时间戳存储在表timestamps的ts字段中,我们以「时间间隔不超过2分钟则归为同一组」为规则(匹配你给出的示例结果),用窗口函数就能完成:

WITH grouped_ts AS (
  SELECT
    ts,
    -- 当当前时间与上一条的间隔超过2分钟(120秒)时,标记为新组起点,累积生成分组ID
    SUM(CASE WHEN EXTRACT(EPOCH FROM ts - LAG(ts) OVER (ORDER BY ts)) > 120 THEN 1 ELSE 0 END) 
    OVER (ORDER BY ts) AS group_id
  FROM timestamps
)
-- 按分组聚合,提取每组的起止时间
SELECT
  MIN(ts) AS start,
  MAX(ts) AS end
FROM grouped_ts
GROUP BY group_id
ORDER BY start;

代码逻辑说明:

  • LAG(ts) OVER (ORDER BY ts):先按时间戳排序,获取当前行的上一行时间戳。
  • EXTRACT(EPOCH FROM ts - LAG(ts)):计算当前时间与上一行的时间差(单位:秒),这里2分钟对应120秒。
  • SUM(...) OVER (ORDER BY ts):累积求和,每次遇到超过阈值的时间差就加1,这样相同group_id的时间戳就属于同一聚类组。
  • 最后按group_id分组,取每组的最小时间作为start、最大时间作为end,就得到你要的聚类结果。

如果需要调整聚类的时间阈值,比如改成1分钟,只需要把120换成60即可。不同SQL方言的时间差计算语法略有不同(比如MySQL用TIMESTAMPDIFF(SECOND, LAG(ts) OVER (ORDER BY ts), ts)),但核心逻辑完全一致。

内容的提问来源于stack exchange,提问作者Carl Patenaude Poulin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 17:22:14