SQL中PARTITION BY结合row_number按日期序号分组取数问题
问题原因
原SQL无法返回预期结果,核心错误有3个:
- 窗口函数
PARTITION BY分组字段配置错误:将Seqn放进了分组字段,会导致每个唯一的(Date+Item+Location+Seqn)组合单独成组,每组仅1条记录,计算出的row_num永远为1,无法实现同Date下按Seqn排序生成连续序号的需求 - 存在多余过滤逻辑:添加了
row_num = 1的过滤条件,会把同Date下Seqn更大的记录全部筛除,和你需要保留同Date下所有记录、生成连续序号的需求冲突 - 字段名笔误:最后ORDER BY子句中写的
trdt字段在查询逻辑中不存在,实际应为date字段,运行时会直接报字段不存在的错误
正确SQL实现
SELECT Date, Item, Location, Seqn, ROW_NUMBER() OVER( PARTITION BY Item, Location, Date ORDER BY Seqn ASC ) AS `Row_number` FROM table1 WHERE Item = 'A1234' AND Location = 'L1' ORDER BY Date, Seqn
逻辑说明
- 分组规则:
PARTITION BY仅保留需要聚合的维度,将相同Item、Location、Date的记录归为同一组,完全匹配“同一Date下排序”的需求 - 排序规则:组内按
Seqn升序排列,依次生成从1开始的连续序号,和给出的预期结果完全一致 - 移除了多余的嵌套CTE和错误过滤条件,逻辑更简洁,执行效率更高
内容的提问来源于stack exchange,提问作者Junie
相关产品推荐
相关产品推荐

