我有一个表,它保存的客户信息与帐户状态(工作或停用)每一天。
我试图通过显示更改的开始日期和结束日期来减少这些信息。因此,如果客户工作10个月,停用一个月,然后再工作一个月,我将有三行数据,而不是365行数据。
我尝试了以下SQL:
SELECT ACTUAL_DAY, ACCT_STAT,
RANK() OVER (PARTITION BY ACCT_STAT ORDER BY ACTUAL_DAY ASC) AS Ranking
FROM TABLE_A
WHERE CUSTOMER = '123456'
AND ACTUAL_DAY >= '19-Mar-2012'
GROUP BY ACTUAL_DAY, ACCT_STAT
ORDER BY ACTUAL_DAY;我得到的结果是:
ACTUAL_DAY|ACCT_STAT|RANKING
============================
19/03/2012|W|1
21/03/2012|W|2
22/03/2012|W|3
23/03/2012|W|4
24/03/2012|D|1
25/03/2012|D|2
26/03/2012|D|3
27/03/2012|D|4
28/03/2012|W|5
29/03/2012|W|6但是,我希望它看起来像这样,这样我就可以从每个级别找到MIN和MAX日期来构建我的表。
ACTUAL_DAY|ACCT_STAT|RANKING
============================
19/03/2012|W|1
21/03/2012|W|1
22/03/2012|W|1
23/03/2012|W|1
24/03/2012|D|2
25/03/2012|D|2
26/03/2012|D|2
27/03/2012|D|2
28/03/2012|W|3
29/03/2012|W|3我希望有一种简单的方法来做这件事,或者完全不同的方式
谢谢
发布于 2012-03-30 09:45:35
一种方法是通过使用lag在每次状态变化时设置一个标志来嵌套分析,然后在第二步中将它们加起来(您不需要指定一个窗口子句,因为“如果你省略了窗户_子句,则默认值介于无界的前一行和当前行之间.“)
select actual_day, acct_stat, sum(counter) over (order by actual_day) as rnk
from ( select actual_day, acct_stat,
case when acct_stat<>(lag(acct_stat) over (order by actual_day)) then 1 else 0 end
as counter
from foo );https://dba.stackexchange.com/questions/15851
复制相似问题