Разделение данных на подгруппы на основе битовых полей - PullRequest
0 голосов
/ 10 декабря 2010

У меня есть первые 4 столбца данных, и я не хочу использовать функции ранжирования в SQL 2008 R2 для получения пятого столбца.Каков наилучший способ разделения данных на подгруппы на основе полей 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

Ответы [ 2 ]

0 голосов
/ 10 декабря 2010

Рекурсивное решение 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 ;

PS Рекомендуется избегать использования ключевых слов SQL (например, GROUP) в качестве имен таблиц / столбцов

0 голосов
/ 10 декабря 2010

Похоже, 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...