根据日期删除 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;
注意不需要re-join的table,可以直接删除从t
导出的table.
我有一个名为“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;
注意不需要re-join的table,可以直接删除从t
导出的table.