如果日期匹配,SQL 删除重复项

Posted

技术标签:

【中文标题】如果日期匹配,SQL 删除重复项【英文标题】:SQL Delete duplicates if the date matches 【发布时间】:2022-01-16 06:01:16 【问题描述】:

我有一张简单的桌子:

Create Table data
( 
    PersonID int,
    LastName varchar(255),
    FirstName varchar(255),
    Price Int,             
    Date date,
    Tmstmp date
)

用值填充表:

INSERT INTO data (PersonID, LastName, FirstName, Price, date, Tmstmp)
VALUES (1, 'John', 'Snow', 100, '2020-04-08', '2020-01-01 10:34:09.000');
INSERT INTO data (PersonID, LastName, FirstName, Price, date, Tmstmp)
VALUES (2, 'Tony', 'Stark', 100, '2020-05-10', '2020-01-01 11:34:09.000');
INSERT INTO data (PersonID, LastName, FirstName, Price, date, Tmstmp)
VALUES (3, 'Tony', 'Stark', 120, '2021-12-11', '2020-01-01 12:34:09.000');
INSERT INTO data (PersonID, LastName, FirstName, Price, date, Tmstmp)
VALUES (4, 'Tony', 'Stark', 125, '2021-12-11', '2020-01-01 13:34:09.000');

目标是仅保留日期最近的值。但仅当日期重复时。 这样托尼·斯塔克就会有 2 条记录,有 2 个日期。具有相同日期2021-12-11 和最旧时间戳的重复行将被删除。

所以记录将如下所示:

我尝试在表上进行自联接,但无法正常工作。也尝试使用 ROW_NUMBER 但我对 Partition By 的工作方式感到困惑。对实现我的目标的任何帮助将不胜感激。

我尝试过但没有成功

DELETE FROM data d1
INNER JOIN data d2
ON d1.personID = d2.personID
AND d1.Date = d2.Date
WHERE d1.Tmstmp < d2.Tmstmp

【问题讨论】:

请标记您的特定数据库 我其实用的是sqliteonline.com,所以数据库无关 怎么样?看起来这支持几种不同的 RDBMS inc mysql、Postgres 和 Sql Server,那么它有什么不相关的? 【参考方案1】:

在大多数现代 RDBMS 中,您可以将 可更新 CTE行号

结合使用
with d as (
    select *,
      Row_Number() over(partition by firstname, lastname, date order by Tmstmp desc) rn
    from data
)
delete from d
where rn>1

【讨论】:

得到错误:no such table: d 也许是因为我使用的是网站而不是 ssms?感谢您的帮助 听起来您在 sqliteonline.com 上选择的引擎在这种情况下不支持 CTE,如果我选择例如使用 MS SQL,它可以正常工作。见example Fiddle 顺便问一下,在partition by 中只使用firstname, lastname and date 是什么意思?我读过它,但不太明白它的含义。 分区本质上是行的分组方式,您需要考虑时间戳对于这 3 列上常见的每组行的变化。 是的,但如果你这样做是因为它们是不同的,每一行都会变成自己的组,你也好不到哪里去。

以上是关于如果日期匹配,SQL 删除重复项的主要内容,如果未能解决你的问题,请参考以下文章

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

如果两个值匹配,则从 php 中的多维关联数组中删除重复项

xslt2+ 如何将组与任何匹配的元素组合并删除元素的重复项

在视图中删除具有 drupal 重复日期的重复项

根据多列和日期时间删除重复项

Python startswith() 不删除所有匹配项[重复]