SQL Server 2014中如何编写T-SQL实现ProfileID+ArrivalDate组合去重?
解决SQL Server 2014中按组合去重保留任意记录的问题
嘿,针对你这个需求,我给你两种在SQL Server 2014里完全可行的写法,你可以根据实际情况选择:
方法一:使用窗口函数ROW_NUMBER()(灵活可控)
这种方法的好处是,如果你之后需要指定保留某条特定记录(比如最小/最大BkgID),只需要改排序逻辑就行,非常灵活:
WITH RankedData AS ( SELECT BkgID, ProfileID, ArrivalDate, -- 按ProfileID和ArrivalDate分组,每组内随机选择一条记录 ROW_NUMBER() OVER (PARTITION BY ProfileID, ArrivalDate ORDER BY (SELECT NULL)) AS RowNum FROM Table1 ) SELECT BkgID, ProfileID, ArrivalDate FROM RankedData WHERE RowNum = 1;
说明:
PARTITION BY ProfileID, ArrivalDate表示把相同ProfileID+ArrivalDate的记录归为一组ORDER BY (SELECT NULL)让SQL Server随机选取组内的一条记录;如果想固定保留最小的BkgID,改成ORDER BY BkgID ASC,最大则改成ORDER BY BkgID DESC
方法二:使用GROUP BY+聚合函数(简洁高效)
如果你的需求只是“保留任意一个BkgID”,用GROUP BY配合MIN/MAX聚合函数会更简洁直观:
SELECT MIN(BkgID) AS BkgID, -- 换成MAX(BkgID)也可以,按需选择 ProfileID, ArrivalDate FROM Table1 GROUP BY ProfileID, ArrivalDate;
说明:
- 按
ProfileID和ArrivalDate分组后,用MIN或MAX取组内的一个BkgID,结果完全符合你的去重要求 - 这种写法性能通常不错,尤其是当
ProfileID和ArrivalDate有联合索引的时候,查询效率会更高
内容的提问来源于stack exchange,提问作者user3115933
相关产品推荐
相关产品推荐

