如何在DENSE_RANK分区排名中跳过前10条并按州取50条?
可行,以下是具体实现方案
方案1:基于你已有的DENSE_RANK()实现
因为DENSE_RANK()会对相同人口的记录赋予相同排名,若要跳过每个州排名前10的记录(包含并列第10的所有记录),同时每个州最多保留50条,可在外层查询添加过滤条件:
SELECT * FROM ( SELECT state, population, -- 你的原有排名逻辑 DENSE_RANK() OVER (PARTITION BY state ORDER BY population DESC) AS ranking FROM your_table_name ) ranked_data -- 跳过前10名,取后续最多50条 WHERE ranking > 10 AND ranking <= 60;
⚠️ 注意:如果存在多条记录并列第10名,DENSE_RANK()会让这些记录的ranking均为10,过滤ranking>10会跳过所有并列第10的记录。这种情况下,最终每个州返回的记录数可能不严格等于50条——比如第11名有多个并列时结果会超过50;若前10名包含大量并列,后续可用记录不足50时结果会少于50。
方案2:用ROW_NUMBER()精确控制记录数
如果需要严格跳过前10条、每个州恰好保留50条(不受人口并列影响),建议改用ROW_NUMBER(),它会给每个分区内的记录赋予唯一序号:
SELECT * FROM ( SELECT state, population, ROW_NUMBER() OVER (PARTITION BY state ORDER BY population DESC) AS row_num FROM your_table_name ) numbered_data -- 跳过前10条,取第11到第60条(共50条) WHERE row_num BETWEEN 11 AND 60;
这个方案能保证每个州返回恰好50条记录(若该州总记录数≥60;若总记录数不足60,则返回从第11条到末尾的所有记录)。
内容的提问来源于stack exchange,提问作者Pandafreak
相关产品推荐
相关产品推荐

