2016-07-15 107 views
0

我想在下面的數據集上寫一個查詢來添加一個新的列,它有某種「period_id_group」。查詢以確定連續的範圍

contiguous new_period row_nr new_period_starting_id 
0   0   1  0 
1   1   2  2 
1   0   3  0 
1   0   4  0 
1   1   5  5 
1   0   6  0 

我想要得到的是:

contiguous new_period row_nr new_period_starting_id period_id_group 
0   0   1  0       0 
1   1   2  2       2 
1   0   3  0       2 
1   0   4  0       2 
1   1   5  5       5 
1   0   6  0       5 

的邏輯是,在new_period_starting_id各爲0值,它必須得到上面的行>0值。

所以,row_nr = 1因爲沒有排在它之前,period_id_group爲0

對於row_nr = 2,因爲這是一個新的perid(由new_period = 1標記)時,period_id_group爲2(此行的ID)。

對於row_nr = 3因爲它是一個連續範圍的一部分(因爲contiguous = 1),而不是範圍的開始,因爲它不是一個NEW_PERIOD(new_period = 0),其period_id_group應繼承上一行的值(也就是連續範圍的開始) - 在這種情況下也是period_id_group = 2

我已經嘗試了多個版本,但無法獲得SQL Server 2008R2的良好解決方案,因爲我無法使用LAG()

我有什麼,到目前爲止,是可恥的:

select * 
from #temp2 t1 
left join (select distinct new_period_starting_id from #temp2) t2 
    on t1.new_period_starting_id >= t2.new_period_starting_id 
where 1 = case 
      when contiguous = 0 
       then 1 
      when contiguous = 1 and t2.new_period_starting_id > 0 
       then 1 
      else 1 
     end 
order by t1.rn 

樣本數據腳本

declare @tmp2 table (contiguous int 
        , new_period int 
        , row_nr int 
        , new_period_starting_id int); 

insert into @tmp2 values (0, 0, 1, 0) 
         , (1, 1, 2, 2) 
         , (1, 0, 3, 0) 
         , (1, 0, 4, 0) 
         , (1, 1, 5, 5) 
         , (1, 0, 6, 0); 

任何幫助表示讚賞。

+0

@yatinparab更新了我的問題 –

回答

0

找到了解決辦法:

select * 
    , case 
     when contiguous = 0 
      then f1 
     when contiguous = 1 and new_periods = 1 
      then f1 
     when contiguous = 1 and new_periods = 0 
      then v 
     else NULL 
    end [period_group] 
from (
    select * 
     , (select max(f1) from #temp2 where new_period_starting_id > 0 and rn < t1.rn) [v] 
    from #temp2 t1 
    ) rs 
order by rn 
1

所以,如果我正確地理解你,你只需要一個額外的列。

SELECT t1.contiguous, t1.new_period, t1.row_nr, t1.new_period_starting_id, 
    (SELECT TOP 1 (new_period_starting_id) 
    FROM YourTable t2 
    WHERE t2.row_nr <= t1.row_nr 
     AND t2.period_id_group > 0 /* optimization */ 
    ORDER BY t2.row_nr DESC /* optimization */) AS period_id_group 
FROM YourTable t1 
+1

這就是我剛剛做的,我得到了答案。不過,upvoted你的答案以及 –

+0

謝謝!我使用ORDER BY將其更改爲「TOP 1」以提高效率。 MAX將不得不查詢所有以前的行,而TOP 1與ORDER BY查詢只有少數。 –

1

下面是該另一種選擇。

select t1.contiguous 
    , t1.new_period 
    , t1.row_nr 
    , t1.new_period_starting_id 
    , x.new_period_starting_id 
from @tmp2 t1 
outer apply 
(
    select top 1 * 
    from @tmp2 t2 
    where (t2.row_nr = 1 
     or t2.new_period_starting_id > 0) 
     and t1.row_nr >= t2.row_nr 
    order by t2.row_nr desc 
) x