You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 23:45:36