2012-07-26 25 views
2

我基本上是在sql之後執行以下操作。我是在一系列連續的數字之後,與列B發生變化時相關,但是保持列ID依次爲 我嘗試過密集等級,但它總是拋出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 

INTO

 
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 
+2

在預期的輸出,具有ID的行= 4已經在列C中的遞增值是正確的? – 2012-07-26 05:08:02

回答

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霍克斯指出。


UPDATE

這將生成的預期結果:

--#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; 
+0

非常感謝你們兩位在這方面的幫助,是的,你是正確的,增量的原因是任何帶有零的東西都應該按照給出的例子遞增。這是因爲在列B中標記爲1的任何事物將這些行定義爲彼此連續。但是,如果你回到了零,它應該返回到序列,如果你趕上我的漂移。所以如果你在B列中有1,1,1,0,0,0,0,1,1,0,0,0,它會讀取類似1,1,1,2,3,4,5,6 ,列C中的6,7,8,9,但再次確保ID列的順序也是asc。 jonearles已經差不多了! – phatz 2012-08-07 00:47:58