2016-11-21 68 views
0

我使用的數據集,看起來像這樣的工作:的Oracle SQL - 總結時間序列劃分基礎上每月

MTD  | ID | Active 
----------------------- 
01-APR-16 | A | y 
01-MAY-16 | A | y 
01-JUN-16 | A | n 
01-JUL-16 | A | y 
01-AUG-16 | A | n 
01-APR-16 | B | n 
01-MAY-16 | B | y 
01-JUN-16 | B | y 
01-JUL-16 | B | y 
01-AUG-16 | B | y 

我想向計列添加到計數數量的數據集在當前MTD之後,某個ID已激活('y')的次數。所需的輸出是:

MTD  | ID | Active | COUNT 
------------------------------- 
01-APR-16 | A | y  | 2 
01-MAY-16 | A | y  | 1 
01-JUN-16 | A | n  | 1 
01-JUL-16 | A | y  | 0 
01-AUG-16 | A | n  | 0 
01-APR-16 | B | n  | 4 
01-MAY-16 | B | y  | 3 
01-JUN-16 | B | y  | 2 
01-JUL-16 | B | y  | 1 
01-AUG-16 | B | y  | 0 

我想到的查詢是:

SELECT 
MTD, 

ID, 

ACTIVE, 

SUM(CASE WHEN MTD > (current records MTD) 
      AND ACTIVE = 'y' THEN 1 ELSE 0 END) 
      OVER (PARTITION BY ID) 
    as COUNT 

我不知道如何將每個記錄的MTD窗口總和與當前記錄的MTD。我如何修改案例陳述的第一行?

謝謝

瑞恩·巴克

+0

也許只是爲了'通過MTD desc'的ID後,在中? – xQbert

回答

3

使用count() over()range規範,所以你看看當前行(對於每個ID)後面的行爲活動標誌y並只計數它們。這假定mtd是一個date列的排序工作。

SELECT 
MTD, 
ID, 
ACTIVE, 
COUNT(case when active='y' then 1 end) OVER(partition by ID order by mtd range between 1 following and unbounded following) 
FROM your_table 

Sample Demo

+0

我沒有意識到存在以下關鍵字。這是非常有用的。謝謝! –

0

對我來說,它看起來像你想反向「Y」來概括的行數。類似這樣的:

select t.*, 
     greatest(sum(case when active = 'y' then 1 else 0 end) over (partition by id order by mtd desc) - 1, 
       0) 
from t; 

您的想法非常接近。分區子句中只需要一個order by

+0

我想在當月之後總結所有「y」。這很接近,但並不完全。如果我有n,y,n,y,y作爲ACTIVE列,則查詢將返回計數2,2,1,1,0。我要查找的計數是3,2,2,1,0。 –

+0

@RyanBarker。 。 。我看不出如何通過問題中的計數來解決評論中的計數。你使用MTD並沒有什麼幫助。我不確定這意味着什麼。 –

+0

嗨戈登,對不起,我應該更清楚。 MTD =迄今爲止的月份。這是記錄發生時的值。我正在計算記錄發生後活動次數='y'的次數。請參閱vkp的解決方案:通過說明1之後和無界跟隨之間的範圍以及MTD在分區中的排序,只有當您執行計數時,纔會從當前記錄晚於1個MTD考慮數據集結束。那有意義嗎? –