SQL:仅按连续的行分组

问题描述 投票:1回答:3

我有一个包含一百万行和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

因此,可以说我要删除列C,而我只需要保留第一个唯一记录。我需要的记录是1、3、5和7。所以我的问题是如何将1和2和4分组,而不是第6行?

sql sql-server
3个回答
1
投票

如果我没看错,请提供数据:

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处看到它的作用。


0
投票

您可以使用row_number()方法的不同之处:

select min(Id), otherId, a, b
from (select t.*,
             (row_number() over (order by id) - 
              row_number() over (partition by otherId, a, b order by id)
             ) as grp
     ) t
group by otherId, a, b, grp;

对于相邻行中具有相同值的行,行号的不同是恒定的。


0
投票

您可以使用以下查询获得第1、3和5行

 SELECT * FROM (SELECT tbl.*,
              ROW_NUMBER() OVER (PARTITION BY otherId, a, b ORDER BY id)
             AS rn
             FROM [tablename] tbl
     ) t
WHERE rn = 1

但是获取第7行的要求并不明确,因为它不是唯一行(与第1,2,4行相同)>

© www.soinside.com 2019 - 2024. All rights reserved.