You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何过滤SQL UNION查询结果,去重并保留最新日期记录?

解决UNION后重复记录,保留每个authorize_id最新记录的方案

嘿,我明白你的需求了——你把两个采购审批表的聚合结果用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;

代码解释

  1. CTE combined_approvals:把你原来的两个聚合查询用UNION ALL合并,这里用UNION ALL比UNION更高效——毕竟UNION会自动去重,但我们不需要这一步,后面会通过窗口函数精准筛选最新记录。
  2. 窗口函数ROW_NUMBER():按authorize_id分组(PARTITION BY),每组内按Last Date Approved倒序排序,给每条记录分配一个行号rn,最新的那条记录行号就是1。
  3. 外层筛选:只取rn = 1的记录,这样每个authorize_id就只会保留最新的那条审批记录。

针对你的样本数据,运行结果会是:

AUTHORIZE_IDAuthorizer NameLast Date ApprovedApproval Type
AANDRAlfredo And2016-09-06 13:08PO
AESFAHArash Esf2017-05-26 13:28PO
AHAMMAhmed Hamd2019-12-04 14:15PO
AJAHANAl Jaha2013-10-29 14:17PO

这样就完美解决了重复问题,每个authorize_id只保留了最新的审批记录~

内容的提问来源于stack exchange,提问作者GGes

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 08:32:34