如何实现按lprReportId去重并优先选择lprOwner为'ABCD'的行?
解决方案
当然可以实现这个需求!我们可以利用SQL的窗口函数来精准控制每组数据的筛选逻辑,完美匹配你的要求:
核心思路
- 按
lprReportId对数据进行分组,确保同一报告ID的记录放在一起 - 给每组内的记录设置优先级:优先保留
lprOwner = 'ABCD'的行,其他行优先级靠后 - 从每组中只取优先级最高的那一行
完整查询语句
SELECT lprArchived, lprReportId, lprOwner FROM ( SELECT lprArchived, lprReportId, lprOwner, -- 给每组记录编号,ABCD的行排第一 ROW_NUMBER() OVER ( PARTITION BY lprReportId ORDER BY CASE WHEN lprOwner = 'ABCD' THEN 1 ELSE 2 END ASC ) AS row_num FROM ReportIndex WHERE lprArchived = 1 ) ranked WHERE row_num = 1;
代码解释
PARTITION BY lprReportId:将查询结果按报告ID分组,保证同一lprReportId的记录在同一组内处理ORDER BY CASE WHEN lprOwner = 'ABCD' THEN 1 ELSE 2 END ASC:通过CASE表达式给lprOwner为'ABCD'的行赋予更高的优先级(值越小越靠前),确保它在每组中排第一ROW_NUMBER():为每组内的记录按优先级顺序分配唯一编号,第一行编号为1- 外层查询筛选
row_num = 1的记录,正好保留每组中优先级最高的那一行
额外说明
因为你提到同一lprReportId下最多仅有一行lprOwner = 'ABCD'的记录,所以这个逻辑完全适配你的场景。即使出现极端情况(比如有多条ABCD的记录),ROW_NUMBER()也只会保留其中一行,完全符合你的要求。
内容的提问来源于stack exchange,提问作者Jonathan Wood
相关产品推荐
相关产品推荐

