根据日期删除 table 中的特定重复条目和原始条目

deleting specific duplicate and original entries in a table based on date

我有一个名为“main”的 table,它有 4 列,ID、名称、DateID 和 Sign。

我想创建一个查询,如果在某个 DateID 中有两次相同的 ID 记录,将删除此 table 中的条目。

我有一个搜索前 3 周的 where 子句

 where DateID =((SELECT MAX( DateID)
                                WHERE DateID < ( SELECT MAX( DateID )-3))

例如我正在使用的数据集:

id name DateID sign
12345 Paul 1915 Up
23658 Danny 1915 Down
37868 Jake 1916 Up
37542 Elle 1917 Up
12345 Paul 1917 Down
87456 John 1918 Up
78563 Luke 1919 Up
23658 Danny 1920 Up

在上述情况下,ID 12345 的两个条目都需要删除。 然而,ID 23658 的条目需要保留为 DateID > 3

这怎么可能?

希望这有效:

DELETE FROM test_tbl
WHERE id IN (
                SELECT T1.id
                FROM test_tbl T1
                WHERE EXISTS (SELECT 1 FROM test_tbl  T2 WHERE T1.id = T2.id AND ABS(T2.dateid - T1.dateid) < 3 AND T1.dateid <> T2.dateid)
            ) 

如果你需要更多的数据处理逻辑,我建议使用存储过程。

您可以为此使用 window 个函数。

不太清楚,但似乎LAG和条件COUNT应该符合你的需要。

DELETE t
FROM (
    SELECT *,
      CountWithinDate = COUNT(CASE WHEN t.PrevDate >= t.DateId - 3 THEN 1 END) OVER (PARTITION BY t.id)
    FROM (
        SELECT *,
          PrevDate = LAG(t.DateID) OVER (PARTITION BY t.id ORDER BY t.DateID)
        FROM YourTable t
    ) t
) t
WHERE CountWithinDate > 0;

db<>fiddle

注意不需要re-join的table,可以直接删除从t导出的table.