2016-11-21 73 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考虑数据集结束。那有意义吗? –