3

連続した 1 または '101' のグループがある場合は常に、'bit' 列で、それらの値をグループ化したいと考えています。例: 11 はグループです。101はグループです。110111はグループです。00100 はグループではありません。以下にいくつかの例を示します。

例1:

╔════╦══════╦═══════╗
║ ID ║  BIT ║ GROUP ║
╠════╬══════╬═══════╣
║  1 ║    0 ║     1 ║
║  2 ║    1 ║     2 ║
║  3 ║    1 ║     2 ║
║  4 ║    0 ║     2 ║
║  5 ║    1 ║     2 ║
║  6 ║    0 ║     3 ║
║  7 ║    0 ║     4 ║
╚════╩══════╩═══════╝

例2:

╔════╦══════╦═══════╗
║ ID ║  BIT ║ GROUP ║
╠════╬══════╬═══════╣
║  1 ║    0 ║     1 ║
║  2 ║    0 ║     2 ║
║  3 ║    1 ║     3 ║
║  4 ║    1 ║     3 ║
║  5 ║    1 ║     3 ║
║  6 ║    0 ║     4 ║
║  7 ║    0 ║     5 ║
╚════╩══════╩═══════╝

例3:

╔════╦══════╦═══════╗
║ ID ║  BIT ║ GROUP ║
╠════╬══════╬═══════╣
║  1 ║    1 ║     1 ║
║  2 ║    1 ║     1 ║
║  3 ║    0 ║     1 ║
║  4 ║    1 ║     1 ║
║  5 ║    1 ║     1 ║
║  6 ║    1 ║     1 ║
║  7 ║    0 ║     2 ║
╚════╩══════╩═══════╝

注: パターンを破る各行には、独自のグループがあります。

私は本当にこれにこだわっています。誰かアイデアはありますか?

4

2 に答える 2

0

これを試して:

select Id, [Bit]
    , case gr
        when 0 then Id - row_number() over(partition by gr order by Id)
        else row_number() over(partition by gr order by Id) end as [Group]
from (
    select Id, b0 as [Bit]
        , case when
               (b0 = 1 and b1 = 1)
            or (b0 = 1 and b1 = 0 and b2 = 1)
            or (b_1 = 1 and b0 = 0 and b1 = 1) then 0 else 1 end as gr
    from (
        select Id+x as Id
            , min(case x when -1 then b end) b_1
            , min(case x when 0 then b end) b0
            , min(case x when 1 then b end) b1
            , min(case x when 2 then b end) b2
        from (
            select Id, cast([Bit] as int) as b
            from MyTable
        ) T
        cross join (values(-1),(0),(1),(2))x(x)
        group by Id+x
        having min(case x when 0 then b end) is not null
    ) T
) T
order by Id
于 2013-09-10T15:01:25.517 に答える