如何筛选ROW_NUMBER()生成的PRank大于1的分区结果?
筛选ROW_NUMBER()生成的PRank大于1的记录
你已经用ROW_NUMBER()完成了按CountryCode和ClientRef分区、QuoteDate排序的步骤,要筛选出PRank > 1的结果,有两种常用且易读的实现方式,适配大部分主流SQL数据库(比如SQL Server、MySQL 8+、PostgreSQL等):
方法1:子查询嵌套
把生成PRank的查询作为内层子查询,在外层直接添加筛选条件就行:
SELECT * FROM ( SELECT CountryCode, ClientRef, [Quote Ref], Name, Address, PostCode, PreferencesCode, QuoteDate, PolicyType, ROW_NUMBER() OVER (PARTITION BY CountryCode, ClientRef ORDER BY QuoteDate) AS PRank FROM 你的实际表名 ) AS RankedResults WHERE PRank > 1;
方法2:用CTE(公共表表达式)优化可读性
如果你的数据库支持CTE(现在大部分现代SQL引擎都支持),这种写法结构更清晰,后期维护起来也方便:
WITH RankedResults AS ( SELECT CountryCode, ClientRef, [Quote Ref], Name, Address, PostCode, PreferencesCode, QuoteDate, PolicyType, ROW_NUMBER() OVER (PARTITION BY CountryCode, ClientRef ORDER BY QuoteDate) AS PRank FROM 你的实际表名 ) SELECT * FROM RankedResults WHERE PRank > 1;
小提醒:
- 记得把代码里的
你的实际表名替换成你真实的表名称 - 像
Quote Ref这种带空格的列名,不同数据库的转义方式可能不一样(比如SQL Server用方括号,MySQL用反引号),保持和你原查询的写法一致就好 - 这两种方法本质逻辑相同:先计算所有行的PRank值,再过滤出符合条件的记录,选哪种全看你个人的代码风格偏好
内容的提问来源于stack exchange,提问作者Phteven
相关产品推荐
相关产品推荐

