如何过滤SQL UNION查询结果,去重并保留最新日期记录?
嘿,我明白你的需求了——你把两个采购审批表的聚合结果用UNION拼起来后,同一个authorize_id会出现两条记录(一条PR、一条PO),你想要每个authorize_id只保留最后审批日期最新的那一条,对吧?
核心思路
我们可以先把你原来的UNION查询结果作为一个临时数据集,然后用窗口函数给每个authorize_id的记录按审批日期倒序排序,只取排序后第一条(也就是日期最新的那条)。
具体SQL代码
WITH combined_approvals AS ( SELECT authorize_id, purchase_authorizer_api.Get_Name(authorize_id) AS "Authorizer Name", MAX(date_approved) AS "Last Date Approved", 'PR' AS "Approval Type" FROM PURCH_REQ_LINE_APPROVAL GROUP BY authorize_id UNION ALL -- 用UNION ALL更高效,因为后面会通过窗口函数筛选去重 SELECT authorize_id, purchase_authorizer_api.get_name(authorize_id) AS "Authorizer Name", MAX(date_approved) AS "Last Date Approved", 'PO' AS "Approval Type" FROM PURCHASE_ORDER_APPROVAL GROUP BY authorize_id ) SELECT authorize_id, "Authorizer Name", "Last Date Approved", "Approval Type" FROM ( SELECT *, ROW_NUMBER() OVER ( PARTITION BY authorize_id ORDER BY "Last Date Approved" DESC ) AS rn FROM combined_approvals ) ranked_approvals WHERE rn = 1;
代码解释
- CTE
combined_approvals:把你原来的两个聚合查询用UNION ALL合并,这里用UNION ALL比UNION更高效——毕竟UNION会自动去重,但我们不需要这一步,后面会通过窗口函数精准筛选最新记录。 - 窗口函数
ROW_NUMBER():按authorize_id分组(PARTITION BY),每组内按Last Date Approved倒序排序,给每条记录分配一个行号rn,最新的那条记录行号就是1。 - 外层筛选:只取
rn = 1的记录,这样每个authorize_id就只会保留最新的那条审批记录。
针对你的样本数据,运行结果会是:
| AUTHORIZE_ID | Authorizer Name | Last Date Approved | Approval Type |
|---|---|---|---|
| AANDR | Alfredo And | 2016-09-06 13:08 | PO |
| AESFAH | Arash Esf | 2017-05-26 13:28 | PO |
| AHAMM | Ahmed Hamd | 2019-12-04 14:15 | PO |
| AJAHAN | Al Jaha | 2013-10-29 14:17 | PO |
这样就完美解决了重复问题,每个authorize_id只保留了最新的审批记录~
内容的提问来源于stack exchange,提问作者GGes
相关产品推荐
相关产品推荐

