如何计算唯一ID的累计运行总数?SQL查询结果不符求助
问题原因分析
- 无分组的count窗口函数逻辑错误
你编写的select Id, count(Id) over (order by ID) as Running Total语句没有对ID进行去重,窗口计数统计的是从数据集开头到当前行的非空ID总行数,你的原始表数据量为10000多,自然最终计数会到10000+,和唯一ID数量无关。 - 分组后SQL结果异常的排查点
你的第一个SQL已经按ID分组,理论上每个唯一ID仅对应一行,窗口求和的最大值应该等于唯一ID数,若结果还是异常,可以先排查两个点:- 是否实际分组字段包含了ID之外的其他维度,导致同一个ID被拆分为多行
- ID为字符串类型时,是否存在大小写、前后空格等差异,被数据库判定为不同ID
解决方案
方案1:输出每个唯一ID对应一行的结果
如果你需要每个唯一ID仅返回一条记录,同时携带该ID的累计序号,直接对去重后的ID列表用行号函数即可:
select ID, min(date_time) as first_appear_time, -- 可按需求调整排序规则,比如按ID大小排序就换成order by ID row_number() over (order by min(date_time) asc, ID asc) as runningTotal_ID from Table1 group by ID
方案2:在原始表每一行都携带累计唯一ID数
如果你需要保留原始表的所有行,同一ID的所有行显示相同的累计序号(代表该ID是第几个出现的唯一ID),用密集排名函数即可:
select ID, date_time, -- 按ID本身大小排序统计累计唯一数 dense_rank() over (order by ID) as runningTotal_ID from Table1
如果需要按ID首次出现的时间排序统计累计数,调整排序逻辑即可:
select ID, date_time, dense_rank() over (order by min(date_time) over (partition by ID), ID) as runningTotal_ID from Table1
以上两种方案返回的runningTotal_ID最大值都会等于你表中实际的唯一ID数量200。
内容的提问来源于stack exchange,提问作者Ethan Smih
相关产品推荐
相关产品推荐

