SQL 如果日期匹配则删除重复项
SQL Delete duplicates if the date matches
我有一个简单的table:
Create Table data
(
PersonID int,
LastName varchar(255),
FirstName varchar(255),
Price Int,
Date date,
Tmstmp date
)
使用以下值填充 Table:
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');
目标是仅保留具有最新日期的值。但前提是日期重复。
这样 Tony Stark 将有 2 个记录和 2 个日期。具有相同日期 2021-12-11
和最旧时间戳的重复行将被删除。
因此记录将如下所示:
我尝试在 table 上自行加入,但无法成功。也尝试使用 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
在大多数现代 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
我有一个简单的table:
Create Table data
(
PersonID int,
LastName varchar(255),
FirstName varchar(255),
Price Int,
Date date,
Tmstmp date
)
使用以下值填充 Table:
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');
目标是仅保留具有最新日期的值。但前提是日期重复。
这样 Tony Stark 将有 2 个记录和 2 个日期。具有相同日期 2021-12-11
和最旧时间戳的重复行将被删除。
因此记录将如下所示:
我尝试在 table 上自行加入,但无法成功。也尝试使用 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
在大多数现代 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