基于多条件筛选SQL行:实现每月Excel报表数据转换查询
解决方案
你的思路方向是对的,row_number() 窗口函数就是处理这类「分组筛选最新/有效记录」问题的标准方案。
核心逻辑
我们需要按 ID + PARTNER 分组(同一ID下不同合作伙伴的记录是独立的,比如你示例里的行4属于新合作伙伴,需要单独保留),在每个分组内按记录的先后顺序排序(默认用QUOTE_ID降序,因为后续生成的QUOTE_ID通常对应更新的操作;如果有专门的时间戳字段,用时间戳排序更准确),最后取每个分组内排序第一的记录。
具体SQL查询
WITH ranked_records AS ( SELECT *, -- 按ID和PARTNER分组,组内按QUOTE_ID降序排序,最新记录排第1 ROW_NUMBER() OVER ( PARTITION BY ID, PARTNER ORDER BY QUOTE_ID DESC -- 若存在时间字段(如CREATE_DATE),替换为 ORDER BY CREATE_DATE DESC 更可靠 ) AS rn FROM your_table_name ) SELECT ID, QUOTE_ID, REASON, DECISION, PARTNER, REQUEST_LIMIT, APPROVED_LIMIT FROM ranked_records WHERE rn = 1;
逻辑说明
PARTITION BY ID, PARTNER:将数据划分为「同一ID+同一合作伙伴」的小组,避免不同合作伙伴的记录互相覆盖ORDER BY QUOTE_ID DESC:假设后续操作生成的QUOTE_ID数值更大,确保最新的记录被标记为rn=1- 筛选
rn=1的记录,即可得到每个分组内的最终有效记录,完全匹配你需要保留行3和行4的需求
扩展适配
如果你的覆盖逻辑是基于业务状态(比如补充信息请求的记录被后续批准记录覆盖),可以调整排序规则,优先保留特定状态的记录:
ROW_NUMBER() OVER ( PARTITION BY ID, PARTNER ORDER BY -- 优先保留批准状态的记录 CASE WHEN DECISION = '批准' THEN 1 ELSE 2 END, QUOTE_ID DESC ) AS rn
内容的提问来源于stack exchange,提问作者James Spencer
相关产品推荐
相关产品推荐

