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

如何分组查询结果避免重复行?SQL多表查询优化求助

解决Shipment唯一行查询问题

你遇到的重复行问题,核心是用FIRST_VALUE时没做行过滤,或者错误地把EnteredDate加入了分组——因为同一Shipment会有多个不同的EnteredDate,分组包含它的话自然会返回多行。下面给你几种靠谱的解决办法:

方法1:用ROW_NUMBER()过滤最新行

给每个Shipment的记录按EnteredDate倒序编号,只保留行号为1的记录,这样每个Shipment只会留最新的那一行:

WITH RankedShipments AS (
    SELECT 
        a.Shipment,
        b.Source,
        a.EnteredDate,
        ROW_NUMBER() OVER (PARTITION BY a.Shipment ORDER BY a.EnteredDate DESC) AS rn
    FROM TableA a
    JOIN TableB b ON a.Shipment = b.Shipment
)
SELECT Shipment, Source, EnteredDate AS [Last Entered Date]
FROM RankedShipments
WHERE rn = 1;

方法2:用聚合函数MAX()先取最新日期再关联

先从TableA里按Shipment分组拿到最大的EnteredDate,再和TableB关联,这种写法逻辑更直观:

SELECT 
    a.Shipment,
    b.Source,
    a.LastEnteredDate AS [Last Entered Date]
FROM (
    SELECT Shipment, MAX(EnteredDate) AS LastEnteredDate
    FROM TableA
    GROUP BY Shipment
) a
JOIN TableB b ON a.Shipment = b.Shipment;

注:如果同一个Shipment在TableB里有多个Source值,需要额外处理(比如取第一个或聚合),但假设每个Shipment在TableB里唯一对应一个Source。

方法3:用DISTINCT配合窗口函数(适配你原来的写法)

如果你想保留窗口函数的写法,只需在查询外层加上DISTINCT,因为同一Shipment的FIRST_VALUE结果是相同的,去重后就能得到唯一行:

SELECT DISTINCT
    a.Shipment,
    b.Source,
    FIRST_VALUE(a.EnteredDate) OVER (PARTITION BY a.Shipment ORDER BY a.EnteredDate DESC) AS [Last Entered Date]
FROM TableA a
JOIN TableB b ON a.Shipment = b.Shipment;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 15:42:50