如何按条件统计历史行:排除AM/PM维度实现分组计数
解决同一ID下按日期累计计数(排除时段维度)的SQL方案
你的核心需求是给每个ID下的不同日期分配连续的累计计数,同一日期的AM/PM行共享同一个计数,原用row_number()的问题在于它会给同一日期的不同行分配不同序号,不符合要求。这里提供两种可行的SQL方案:
方案一:直接使用DENSE_RANK函数
这是最简洁的方法,利用DENSE_RANK()的特性——同一分组内相同排序值的行会得到相同的序号,且序号连续递增:
SELECT ID, "Time of day", Date, DENSE_RANK() OVER (PARTITION BY ID ORDER BY Date) AS "Count" FROM your_table;
直接在原表上计算,无需额外子查询,就能让同一ID同一日期的所有行共享相同的累计计数,完全匹配你的期望结果。
方案二:先聚合日期再关联原表
如果你的SQL环境对窗口函数支持有限,或者更倾向于分步逻辑,可以先提取每个ID的唯一日期并生成计数,再关联回原表:
WITH date_rank_cte AS ( SELECT ID, Date, ROW_NUMBER() OVER (PARTITION BY ID ORDER BY Date) AS "Count" FROM your_table GROUP BY ID, Date -- 去重得到每个ID的唯一日期 ) SELECT t.ID, t."Time of day", t.Date, drc."Count" FROM your_table t INNER JOIN date_rank_cte drc ON t.ID = drc.ID AND t.Date = drc.Date;
这个方法先通过分组得到每个ID的日期列表,用ROW_NUMBER()给日期分配递增序号,再通过ID和日期关联,把序号同步到原表的每一行。
两种方案都能实现你要的效果,可根据自己的SQL环境和习惯选择。
内容的提问来源于stack exchange,提问作者Trickett
相关产品推荐
相关产品推荐

