如果日期匹配,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 删除重复项的主要内容,如果未能解决你的问题,请参考以下文章