2

私は基本的に次のことを行うSQLの後です。私は、列 B が変更されたときに関連する一連の数値を求めていますが、列 ID を順番に保持しています。 Dense Rank を試してみましたが、常に ID 列のシーケンスが破棄され、後で混乱します。何か案は?

ID||A||B
01||T||1
02||T||1
03||T||0
04||T||0
05||T||1
06||T||1
07||T||1
08||T||0
09||T||1
10||T||1
11||T||0

の中へ

ID||A||B||C
01||T||1||1
02||T||1||1
03||T||0||2
04||T||0||3
05||T||1||4
06||T||1||4
07||T||1||4
08||T||0||5
09||T||1||6
10||T||1||6
11||T||0||7
4

1 に答える 1

2
--#3: Running total of value changes
select id, a, b
    ,sum(has_changed) over (partition by A order by id
        rows between unbounded preceding and current row) c
from
(
    --#2: Find rows where the value changed.
    select id, a, b
        ,case
            when b = lag(b) over (partition by A order by id) then 0
            else 1
        end has_changed    
    from
    (
        --#1: Test data
        select '01' ID, 'T' A, 1 B from dual union all
        select '02' ID, 'T' A, 1 B from dual union all
        select '03' ID, 'T' A, 0 B from dual union all
        select '04' ID, 'T' A, 0 B from dual union all
        select '05' ID, 'T' A, 1 B from dual union all
        select '06' ID, 'T' A, 1 B from dual union all
        select '07' ID, 'T' A, 1 B from dual union all
        select '08' ID, 'T' A, 0 B from dual union all
        select '09' ID, 'T' A, 1 B from dual union all
        select '10' ID, 'T' A, 1 B from dual union all
        select '11' ID, 'T' A, 0 B from dual
    ) test_data
)
order by id;

結果:

ID  A   B   C
01  T   1   1
02  T   1   1
03  T   0   2
04  T   0   2
05  T   1   3
06  T   1   3
07  T   1   3
08  T   0   4
09  T   1   5
10  T   1   5
11  T   0   6

@Adam Hawkesが指摘したように、あなたの例には余分な増分があると思いますが、まったく同じではありません。


アップデート

これにより、期待される結果が生成されます。

--#3: Running total of value changes, or where the value is 0
select id, a, b
    ,sum(has_changed_or_0) over (partition by A order by id
        rows between unbounded preceding and current row) c
from
(
    --#2: Find rows where the value changed, or where value is 0
    select id, a, b
        ,case
            when b = 0 then 1
            when b = lag(b) over (partition by A order by id) then 0
            else 1
        end has_changed_or_0
    from
    (
        --#1: Test data
        select '01' ID, 'T' A, 1 B from dual union all
        select '02' ID, 'T' A, 1 B from dual union all
        select '03' ID, 'T' A, 0 B from dual union all
        select '04' ID, 'T' A, 0 B from dual union all
        select '05' ID, 'T' A, 1 B from dual union all
        select '06' ID, 'T' A, 1 B from dual union all
        select '07' ID, 'T' A, 1 B from dual union all
        select '08' ID, 'T' A, 0 B from dual union all
        select '09' ID, 'T' A, 1 B from dual union all
        select '10' ID, 'T' A, 1 B from dual union all
        select '11' ID, 'T' A, 0 B from dual
    ) test_data
)
order by id;
于 2012-07-26T06:02:46.673 に答える