PostgreSQL中如何为相同计算字段值分配相同行号?
解决PostgreSQL中相同计算值对应相同行号的需求
你需要用DENSE_RANK()替代ROW_NUMBER()来实现需求,具体原因和修改方案如下:
问题根源
ROW_NUMBER()的特性是在分区内为每行生成唯一的连续序号,哪怕同一分区内的数值完全相同,也会依次递增,这就是你当前结果中相同num_session对应不同rownum的原因。
而DENSE_RANK()的特性是为相同的数值分配相同的排名,且排名是连续的(不会跳号),正好匹配你“相同num_session对应相同行号,不同num_session对应连续递增行号”的需求。
修改后的SQL语句
select m.subscriber, count(distinct s.session_id) as num_session, DENSE_RANK() OVER (ORDER BY count(distinct s.session_id) DESC) AS rownum from dbms.music_stream m, dbms.session s, dbms.users u where m.session_id = s.session_id and m.subscriber = u.user_id and lower(u.subscription_type) = 'premium' and lower(s.platform) = 'app' group by m.subscriber
执行结果说明
执行上述SQL后,所有num_session=2的行会获得rownum=1,所有num_session=1的行会获得rownum=2,完全符合你的期望结果。
内容的提问来源于stack exchange,提问作者BU123
相关产品推荐
相关产品推荐

