2010-12-10 62 views
0

我有前4列數據,我不想使用SQL 2008 R2中的排列函數來派生第5列。什麼是分區基礎上,nextiteminsubgroup和previousiteminsubgroup字段中的數據爲子組的最佳方式?根據位域將數據劃分到子組中

Group OrderInGroup NextItemInSubGroup PreviousItemInSubGroup SubGroup 
    1 1 1 0 1 
    1 2 1 1 1 
    1 3 1 1 1 
    1 4 0 1 1 
    1 5 0 0 2 
    1 6 0 0 3 
    1 7 1 0 4 
    1 8 1 1 4 
    1 9 0 1 4 
    2 1 0 0 1 
    2 2 0 0 2 
    2 3 0 0 3 
    2 4 1 0 4 
    2 5 0 1 4 
    3 1 0 0 1 
    4 1 0 0 1 
    4 2 0 0 2 
    4 3 0 0 3 

回答

0

遞歸CTE溶液:

DECLARE @t TABLE 
([Group] INT 
,OrderInGroup INT 
,NextItemInSubGroup INT 
,PreviousItemInSubGroup INT 
,SubGroup INT 
) 

INSERT @t 
VALUES 
(1,1,1,0,1),(1,2,1,1,1),(1,3,1,1,1),(1,4,0,1,1),(1,5,0,0,2),(1,6,0,0,3), 
(1,7,1,0,4),(1,8,1,1,4),(1,9,0,1,4),(2,1,0,0,1),(2,2,0,0,2),(2,3,0,0,3), 
(2,4,1,0,4),(2,5,0,1,4),(3,1,0,0,1),(4,1,0,0,1),(4,2,0,0,2),(4,3,0,0,3) 

;WITH recCTE 
AS 
(
    SELECT [Group], OrderInGroup,NextItemInSubGroup , PreviousItemInSubGroup, 1 AS subgroup 
    FROM @t 
    WHERE OrderInGroup = 1 

    UNION ALL 

    SELECT r.[Group], t.OrderInGroup,t.NextItemInSubGroup , t.PreviousItemInSubGroup, 
      CASE WHEN r.NextItemInSubGroup = 1 THEN r.subgroup ELSE r.subgroup + 1 END 
    FROM recCTE AS r 
    JOIN @t AS t 
    ON t.[Group] = r.[Group] 
    AND t.OrderInGroup = r.OrderInGroup + 1 
) 
SELECT * FROM recCTE 
ORDER BY [Group],OrderInGroup ; 

P.S.最好的做法是避免使用SQL關鍵字(例如GROUP)作爲表格/列名稱

+0

工作的。我無意引進,當我試圖概括/抽象的問題組。接下來,當我張貼有關SQL問題的時候,我會嘗試在SQL添加數據,所以它更容易立即用它玩。很抱歉的額外的工作,並感謝您的解決方案。 – Martin 2010-12-10 13:53:36

0

似乎0和0重新開始排名。

Select 
     Rank() Over ( 
     Partition By 
      [Group] 
     , Case When [NextItemInSubGroup] + [PreviousItemInSubGroup] = 0 
       Then 0 
       Else 1 
      End 
     Order By [OrderInGroup] 
    ) as [SubGroup] 
From Your_Table; 
+0

對於我的情況,這不起作用,儘管它會按照您的說法從0​​和0重置排名。但在這種情況下,它的排名將第4項是1,2,3,4,而他們需要的是像需要1,1,1,1 – Martin 2010-12-10 08:24:00