如何在Redshift中按日期生成统一分组的rownum?现有SQL出错
修正SQL以实现按日期生成连续统一的序号
嘿,我明白你的需求了——你想要给相同日期的行分配同一个rownum,并且随着日期递增,这个序号也连续上升。但你当前用row_number()加partition by的写法,会让每个日期分组内的序号从1重新开始,所以才会出现所有同日期行的rownum都是1的情况。
要实现预期效果,你需要换用dense_rank()窗口函数,它会根据日期的顺序,给相同日期的行分配相同的排名,而且排名是连续递增的:
select salesid, TO_DATE(created_at,'YYYY-MM-DD') as date, dense_rank() over(order by TO_DATE(created_at,'YYYY-MM-DD')) as rownum from <tablename> order by date;
为什么这个写法能解决问题:
- 去掉了
partition by子句,dense_rank()会基于整个结果集,按日期排序后分配排名 - 相同的日期值会得到完全相同的排名序号,日期递增时排名也会连续增加(比如2018-01-02对应1,2018-01-03对应2,以此类推),完美匹配你给出的示例结果。
如果你好奇,这里也可以用rank()替代dense_rank(),在你的场景下两者结果一致;但dense_rank()更贴合“连续递增”的需求,因为它不会因为日期存在间隔(比如示例中没有2018-01-04)而产生排名间隙。
执行修正后的SQL,你会得到和预期完全一致的结果:
salesid | date | rownum --------+------------+------- 10001 | 2018-01-02 | 1 10006 | 2018-01-02 | 1 10005 | 2018-01-02 | 1 20001 | 2018-01-03 | 2 20002 | 2018-01-03 | 2 30001 | 2018-01-05 | 3 30003 | 2018-01-05 | 3 30004 | 2018-01-05 | 3 30007 | 2018-01-05 | 3 40005 | 2018-01-10 | 4 40001 | 2018-01-10 | 4
内容的提问来源于stack exchange,提问作者Patthebug
相关产品推荐
相关产品推荐

