Oracle 分析函数分组累加!

用户号码 登陆时间 1300000000 2010-01-01 1300000001 2010-01-01 1300000002 2010-01-02 1300000001 2010-01-02 1300000003 2010-01-03 1300000002 2010-01-03 1300000004 2010-01-04 1300000003 2010-01-04 1300000004 2010-01-02 1300000006 2011-01-04 1300000001 2011-01-04

 剔除重复登陆的用户,只计算统计时间内用户的第一次登陆记录。然后每天累加用户数。

 

select b.statusdate, sum(times) over(partition by trunc(b.statusdate, 'mm') order by b.statusdate) from (select a.statusdate, count(1) times from (select phone, trunc(min(statusdate), 'dd') statusdate from test_table t where t.statusdate >= to_date('20100101', 'yyyymmdd') --统计开始时间 and t.statusdate < to_date('20100201', 'yyyymmdd') group by phone) a --取用户第一条记录时间 group by a.statusdate) b

 

由统计开始和结束时间控制数据源。trunc(b.statusdate, 'mm') 控制累加的范围,如果是月则表示按月累计,也就是每月的第一次重新统计。

由于受到trunc(b.statusdate, 'mm') 只能按年,月,日累加所以如果数据源跨年则不能一累加。如果需要一直累加则:

 

select b.statusdate, sum(times) over(partition by b.part order by b.part,b.statusdate) from (select a.part,a.statusdate, count(1) times from (select 1 part,phone, trunc(min(statusdate), 'dd') statusdate from test_table t where t.statusdate >= to_date('20100101', 'yyyymmdd') --统计开始时间 and t.statusdate < to_date('20110201', 'yyyymmdd') group by phone) a --取用户第一条记录时间 group by a.statusdate,a.part) b

增加一个临时字段表示累加范围,例如:1表示数据统计第一次进行累加数据统计,然后按这一次的所有数据进行去重和累叫。

 

你可能感兴趣的:(oracel,学习!)