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

如何在SQL中按ID分组,实现随日期变化的递增计数函数?

问题描述

需要按ID分组,对每个ID下的归还日期实现递增计数规则:同一ID下相同日期的计数保持一致,日期变更时计数加1。尝试过COUNT(DISTINCT date_)和LAG函数,但结果所有行都返回3,现有SQL代码如下:

SELECT t.*,
Sum(CASE WHEN lagged <> date_ then 1 else 0 end) 
Over (ORDER BY id) AS counter --- how can I make this an incremental count?
FROM
(SELECT example.*,
Lag(date_) Over (PARTITION BY id ORDER BY date_) AS lagged
FROM example)t
ORDER BY date_ ASC
调整方案

问题出在窗口函数的分区范围和逻辑判断上,以下是修正后的实现:

SELECT 
    id,
    date_,
    SUM(CASE 
            WHEN lagged_date IS NULL OR lagged_date <> date_ THEN 1 
            ELSE 0 
        END) OVER (PARTITION BY id ORDER BY date_) AS counter
FROM (
    SELECT 
        id,
        date_,
        LAG(date_) OVER (PARTITION BY id ORDER BY date_) AS lagged_date
    FROM example
) t
ORDER BY id, date_ ASC;

关键调整说明:

  • 外层SUM()窗口函数添加PARTITION BY id,确保计数在每个ID内部独立计算,而非全局累加
  • 新增lagged_date IS NULL的判断,处理每个ID下的第一行数据(无前置日期时计数初始化为1)
  • 最终排序改为ORDER BY id, date_,保证每个ID内的日期顺序正确

调整后可实现:每个ID下首次出现的日期计数为1,后续每遇到不同日期计数递增1,相同日期的行计数保持一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 10:42:07