2015-03-25 55 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