如何在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
相关产品推荐
相关产品推荐

