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

Clickhouse中14天按7天分组异常:结果多一组问题排查

按7天分组获取每组最后日期:问题分析与解决

我有2023-07-22到2023-08-04共14天的日期数据,想要按7天分组,最终得到每组最后一天的2个日期结果。执行以下SQL查询:

SELECT toStartOfInterval(date, toIntervalDay(7)) AS week
FROM
(
  SELECT arrayJoin([toDate('2023-07-22'), toDate('2023-08-04')]) AS date
  ORDER BY date ASC WITH FILL STEP 1
)
GROUP BY week
ORDER BY week ASC

但返回了3行不符合预期的结果:

┌────────────────week─┐
│ 2023-07-20 00:00:00 │
│ 2023-07-27 00:00:00 │
│ 2023-08-03 00:00:00 │
└─────────────────────┘

出现了未预期的2023-07-20,与预期的2023-07-29 00:00:00、2023-08-04 00:00:00不符。

问题原因

toStartOfInterval(date, toIntervalDay(7)) 是从**Unix纪元起始日(1970-01-01)**这个固定起点按7天区间划分,并非以你的数据起始日期2023-07-22为基准。2023-07-22落在1970-01-01开始的第N个7天区间(2023-07-20至2023-07-26),因此分组起始日被计算为2023-07-20,导致多生成了一组数据。

正确解决方案

以数据起始日期2023-07-22为基准计算偏移量,自定义分组逻辑,确保分组从起始日开始按7天划分,最终得到每组的最后一天。

正确查询语句:

with
    toDate('2023-07-22') as DATE_FROM,
    toDate('2023-08-04') as DATE_TO,
    7 as DAYS_LENGTH,
    DATE_FROM % DAYS_LENGTH as DAYS_SHIFT
select
    date - (date - DAYS_SHIFT) % DAYS_LENGTH as days_group
FROM
(
    SELECT arrayJoin([DATE_FROM, DATE_TO]) AS date
    ORDER BY date ASC WITH FILL STEP 1
)
GROUP BY days_group
order by days_group
format PrettyCompactMonoBlock
;

内容的提问来源于stack exchange,提问作者glmn

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 02:20:28