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查询删除没有主键的重复记录,保留最新的[重复]的主要内容,如果未能解决你的问题,请参考以下文章

sql语句查询出的两行数据除了主键其他都一样,怎么去掉重复数据

怎么删除ACCESS中的重复记录 只保留一条

SQL 查询 - 组合两个表,删除重复项并仅保留最新的日期

SQL多个主键的表,插入数据有重复时,查询数据的重复值?

sql删除重复数据且只保留一条?

Mysql 中删除重复数据(保留一条)