SQL查询删除没有主键的重复记录,保留最新的[重复]
Posted
技术标签:
【中文标题】SQL查询删除没有主键的重复记录,保留最新的[重复]【英文标题】:SQL query to remove duplicate records without primary key, keeping the most recent [duplicate] 【发布时间】:2021-11-16 18:22:27 【问题描述】:我有一个包含销售交易的交易表 (SQL Express 2014)。我需要删除重复记录,只保留最近的记录
当前数据示例
ACC_PART_MAT TX_DATE
A1025-A552 2021-09-02
A1025-B1994 2121-04-28
A1025-B1994 2121-09-02
A1025-B1994 2121-03-21
A1025-B1960 2121-05-20
需要最终结果
ACC_PART_MAT TX_DATE
A1025-A552 2021-09-02
A1025-B1994 2121-09-02
A1025-B1960 2121-05-20
有许多解决重复记录的示例,但如果没有主键和日期,我无法让它们工作。 非常感谢提前
【问题讨论】:
那么您是否要在每次销售新零件后执行此删除操作?或者您是否要修复设计或存储销售交易的方式(可能是不同表中的历史记录,或者更新给定零件的现有行,或者只是有一个仅显示每个零件最近日期的视图)?跨度> 【参考方案1】:对于您的示例,您可以只使用聚合:
select ACC_PART_MAT, min(TX_DATE) as TX_DATE
from t
group by ACC_PART_MAT;
如果您确实想从表中删除行,您可以使用可更新的 CTE——但要小心,因为这会更改表:
with todelete as (
select t.*,
row_number() over (partition by ACC_PART_MAT order by TX_DATE asc) as seqnum
from t
)
delete from todelete
where seqnum > 1;
【讨论】:
选择而不是删除就足以满足我的要求。提供的选择代码是完美的,但是如果表有其他字段,例如如果表布局是 ACC_PART_MAT、TX_DATE、CUST_NO、CUST_NAME、PRICE,这会受到怎样的影响 通过 CTE 删除作品! (使用 TX_DATE DESC)。杰出的。谢谢 @WillSmyth 。 . .请注意:可更新 CTE 是 SQL Server 特有的功能。我认为它们在任何其他数据库中都不起作用。以上是关于SQL查询删除没有主键的重复记录,保留最新的[重复]的主要内容,如果未能解决你的问题,请参考以下文章