2014-09-26 42 views
0

這是我的輸入表:如何使用oracle計數連勝?

DAY_ID ARTICLE QTY 
01.01.2014 000032 1 
02.01.2014 000032 0 
03.01.2014 000032 0 
04.01.2014 000032 1 
05.01.2014 000032 0 
06.01.2014 000032 0 
07.01.2014 000032 0 
08.01.2014 000032 1 
09.01.2014 000032 1 
10.01.2014 000032 0 
11.01.2014 000032 0 
12.01.2014 000032 1 
13.01.2014 000032 0 

這裏是附加列「連勝」,我想:

DAY_ID ARTICLE QTY streak 
01.01.2014 000032 1 
02.01.2014 000032 0 1 
03.01.2014 000032 0 2 
04.01.2014 000032 1 
05.01.2014 000032 0 1 
06.01.2014 000032 0 2 
07.01.2014 000032 0 3 
08.01.2014 000032 1 
09.01.2014 000032 1 
10.01.2014 000032 0 1 
11.01.2014 000032 0 2 
12.01.2014 000032 1 
13.01.2014 000032 0 1 

我怎樣才能做到這一點使用Oracle?

+0

「條紋」似乎是一列而不是一行。你究竟想要計算什麼?樣本數據的預期輸出是什麼? – Bacs 2014-09-26 09:25:55

+0

嗨!理解 – zotovby 2014-09-26 09:43:22

+0

瞭解更多的問題。對此的任何解決方案都需要按照正確的順序將記錄分類。是否有時間戳或可用於此目的的數字主鍵? – Bacs 2014-09-26 09:50:09

回答

0

如果您在由「第一天ID」(從以前的天最近的一天ID其中,數量爲1),那麼你就可以做到這一點分組你的價值觀成功:

select y.*, case when rnk = 1 then null else rnk - 1 end streak 
from 
(
    select x.*, 
     row_number() over (partition by article, day_id_first order by day_id) rnk 
    from 
    (
    select t.*, 
      (select max(t2.day_id) from my_table t2 where t2.day_id <= t.day_id and t2.qty = 1) day_id_first 
    from my_table t 
) x 
) y 
; 

我保存了所有的中間結果詳細我的計算,這裏是你得到:

DAY_ID  ARTICLE QTY DAY_ID_FIRST RNK STREAK 
01.01.2014 000032 1 01.01.2014 1  
02.01.2014 000032 0 01.01.2014 2 1 
03.01.2014 000032 0 01.01.2014 3 2 
04.01.2014 000032 1 04.01.2014 1  
05.01.2014 000032 0 04.01.2014 2 1 
06.01.2014 000032 0 04.01.2014 3 2 
07.01.2014 000032 0 04.01.2014 4 3 
08.01.2014 000032 1 08.01.2014 1  
09.01.2014 000032 1 09.01.2014 1  
10.01.2014 000032 0 09.01.2014 2 1 
11.01.2014 000032 0 09.01.2014 3 2 
12.01.2014 000032 1 12.01.2014 1  
13.01.2014 000032 0 12.01.2014 2 1 
0

另一種解決方案,它與您提供的數據一起工作。對於每一行我正在制定QTY = 1(與Emmanuel相同)的最近日期,但是我只是簡單地減去日期。

Emmanuel使用分析意味着更靈活的解決方案。如果你知道每天只有一條記錄,我的工作應該是有效的,但如果可能有多個獨特的ARTICLE值,則需要進行修改。

with streak_table as 
(select 
    day_id 
    ,article 
    ,qty 
    ,(select max(yt2.day_id) 
    from your_table yt2 
    where yt2.day_id <= yt1.day_id and yt2.qty=1) reset 
from your_table yt1) 
select day_id 
     ,article 
     ,qty 
     ,decode(day_id - reset, 0, null, day_id - reset) streak 
from streak_table 
order by day_id 
相關問題