我有一个包含一百万行和50多个列的表,其中保留了所有记录更改。由于表的大小非常大,因此需要删除一列,并且需要删除所有随后重复的记录。
ID otherID a b | c
----------------------------------------
1 10 1 2 | 1
2 10 1 2 | 2
3 20 2 2 | 3
4 10 1 2 | 4
5 10 10 2 | 5
6 10 10 2 | 6
7 10 1 2 | 7
因此,可以说我要删除column C
,而我只需要保留第一个唯一记录。我需要的记录是1、3、5和7。所以我的问题是如何将1和2和4分组,而不是第6行?
如果我说对了,那么对于数据:
DECLARE @T TABLE (
ID INT,
otherID INT,
a INT,
b INT
);
INSERT
INTO @T (
ID,
otherID,
a,
b
)
VALUES
(1, 10, 1, 2),
(2, 10, 1, 2),
(3, 20, 2, 2),
(4, 10, 1, 2),
(5, 10, 10, 2),
(6, 10, 10, 2),
(7, 10, 1, 2)
;
以下查询应返回您要查找的内容:
WITH grp AS (
SELECT ID,
otherID,
a,
b,
grp = ROW_NUMBER() OVER(PARTITION BY otherID ORDER BY (id))
- ROW_NUMBER() OVER(PARTITION BY otherID, a, b ORDER BY (id))
FROM @T
),
filter AS (
SELECT ID,
otherID,
a,
b,
grp,
rn = ROW_NUMBER() OVER(PARTITION BY grp, otherID, a, b ORDER BY (id))
FROM grp
)
DELETE
FROM filter
WHERE rn >1;
SELECT *
FROM @T
ORDER BY id
这将返回:
ID otherID a b
-------------------------
1 10 1 2
3 20 2 2
5 10 10 2
7 10 1 2
您可以在SQL Fiddle中看到这一点。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句