首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >等级划分?

等级划分?
EN

Database Administration用户
提问于 2012-03-30 09:25:19
回答 1查看 164关注 0票数 4

我有一个表,它保存的客户信息与帐户状态(工作或停用)每一天。

我试图通过显示更改的开始日期和结束日期来减少这些信息。因此,如果客户工作10个月,停用一个月,然后再工作一个月,我将有三行数据,而不是365行数据。

我尝试了以下SQL:

代码语言:javascript
复制
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;

我得到的结果是:

代码语言:javascript
复制
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日期来构建我的表。

代码语言:javascript
复制
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

我希望有一种简单的方法来做这件事,或者完全不同的方式

谢谢

EN

回答 1

Database Administration用户

发布于 2012-03-30 09:45:35

一种方法是通过使用lag在每次状态变化时设置一个标志来嵌套分析,然后在第二步中将它们加起来(您不需要指定一个窗口子句,因为“如果你省略了窗户_子句,则默认值介于无界的前一行和当前行之间.“)

代码语言:javascript
复制
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 );
票数 3
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/15851

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档