2015-03-25 25 views
0

我想在MS-SQL中创建一个查询来创建一个包含递增组编号的列。MS SQL设置组ID没有循环

这是我多么希望我的数据恢复:

Column 1 | Column 2 | Column 3 
------------------------------ 
    I |  1 |  1 
    O |  2 |  2 
    O |  2 |  3 
    I |  3 |  4 
    O |  4 |  5 
    O |  4 |  6 
    O |  4 |  7 
    O |  4 |  8 
    I |  5 |  9 
    O |  6 | 10 
  • Column 1IO意义和缩小。
  • Column 2是行组(这应该在Column 1更改时递增)。
  • Column 3是行号。

那么我该如何编写我的查询,使Column 2每次增加Column 1更改?

+1

你有任何其他栏里找到 – 2015-03-25 10:05:50

+1

你的问题是没有意义的 – 2015-03-25 10:38:47

+0

任何试图到目前为止的顺序? – stb 2015-03-25 10:40:53

回答

1

首先,要执行这种操作,您需要一些可以识别行顺序的列。如果您确定此目的,例如标识列的列,它可以用来做这样的事情:

Runnable的样本:

CREATE TABLE #Groups 
    (
     id INT IDENTITY(1, 1) , -- added identity to provide order 
     Column1 VARCHAR(1) 
    ) 

INSERT INTO #Groups 
     (Column1) 
VALUES ('I'), 
     ('O'), 
     ('O'), 
     ('I'), 
     ('O'), 
     ('O'), 
     ('O'), 
     ('O'), 
     ('I'), 
     ('O'); 

; 
WITH cte 
      AS (SELECT id , 
         Column1 , 
         1 AS Column2 
       FROM  #Groups 
       WHERE id = 1 
       UNION ALL 
       SELECT g.id , 
         g.Column1 , 
         CASE WHEN g.Column1 = cte.Column1 THEN cte.Column2 
          ELSE cte.Column2 + 1 
         END AS Column2 
       FROM  #Groups g 
         INNER JOIN cte ON cte.id + 1 = g.id 
      ) 
    SELECT * 
    FROM cte 
    OPTION (MAXRECURSION 0) -- required to allow for more than 100 recursions 

DROP TABLE #Groups 

此代码有效地通过记录循环,如果Column1中的值发生变化,则将每行与下一行进行比较并递增Column2的值。

如果您没有标识列,那么您可以考虑添加一个标识列。

信用@AeroX:

用30K的记录,最后一行:OPTION (MAXRECURSION 0)需要使用Common Table Expression (CTE)当覆盖100个递归的默认。将其设置为0意味着它不受限制。

+1

随着OP有30k行,他们需要设置['MAXRECURSION'](http://stackoverflow.com/q/3349322/2594742)级别更高,如果使用这种方法 – AeroX 2015-03-25 11:49:44

+0

@AeroX感谢指针,将相应更新 – Tanner 2015-03-25 11:51:06

1

,如果你有SQLSERVER 2012+

DECLARE @t table(col1 char(1), col3 int identity(1,1)) 

INSERT @t values 
('I'), ('O'), ('O'), ('I'), ('O'), ('O'), ('O'), ('O'), ('I'), ('O') 

;WITH CTE AS 
(
    SELECT 
    case when lag(col1) over (order by col3) = col1 
     then 0 else 1 end increase, 
    col1, 
    col3 
    FROM @t 
) 
SELECT 
    col1, 
    sum(increase) over (order by col3) col2, 
    col3 
FROM CTE 

结果这将工作:

col1 col2 col3 
I  1  1 
O  2  2 
O  2  3 
I  3  4 
O  4  5 
O  4  6 
O  4  7 
O  4  8 
I  5  9 
O  6  10 
+0

不错...而且比我的代码少! – Tanner 2015-03-25 12:03:38

+0

@Tanner自2012年起只感谢良好 – 2015-03-25 12:04:52