标签:
场景:假设现在要分析某天每小时新增累加的一个上升趋势,即在各个时间点拥有的新增用户数的一个趋势。用户明细表tab_createuser,一条记录就是一个新增用户。
首先需要将每小时里新增的角色查询出来:
select to_char(logtime, ‘yyyy-mm-dd-hh24‘) logtime,count(*) createnum from tab_createuser where logtime >= to_date(‘2015-06-17‘, ‘yyyy-mm-dd‘)-1 and logtime < to_date(‘2015-06-18‘, ‘yyyy-mm-dd‘)-1 group by to_char(logtime, ‘yyyy-mm-dd-hh24‘) order by logtime
假设查询出来的记录为:
logtime createnum 2015-06-17-00 3 2015-06-17-01 5 2015-06-17-02 7 2015-06-17-03 9
在0时,新增用户数为3;在1时,新增用户数为5......;那么在0时,拥有的新增用户数为3;在1时,拥有的新增用户数为8;此需求即要求出各个时间点拥有的新增用户数的一个趋势:
sum(createnum) over(partition by to_char(to_date(logtime, ‘yyyy-mm-dd-hh24‘), ‘yyyy-mm-dd‘) order by logtime) as total_create
这个语句就能达到我们想要的结果:因此可以想象一下它的执行逻辑流程,首先拿到2015-06-17-00这个时间,此时有一个空的中间表,然后把这个2015-06-17-00对应的记录放到这个
中间表里,然后查看中间表中与2015-06-17对应的分组,并对这个分组进行sum操作,将操作结果放入到结果表中。
接着,拿到2015-06-17-01这个时间,将其对应的记录放到中间表,并对中间表中2015-06-17的记录进行分组,此时有两条记录满足条件,对分组进行sum操作,将操作结果放入到结果表中。以此类推。。。
具体sql如下:
select logtime,sum(createnum) over(partition by to_char(to_date(logtime, ‘yyyy-mm-dd-hh24‘), ‘yyyy-mm-dd‘) order by logtime) as total_create from (select to_char(logtime, ‘yyyy-mm-dd-hh24‘) logtime, count(*) createnum from tab_createuser where logtime >= to_date(‘2015-06-17‘, ‘yyyy-mm-dd‘)-1 and logtime < to_date(‘2015-06-18‘, ‘yyyy-mm-dd‘)-1 group by to_char(logtime, ‘yyyy-mm-dd-hh24‘) order by logtime) order by logtime
再来看一个sum() over(partition by )的一个例子:
操作数据表(TEST): LOGTIME NUM 2015-06-17 10:07:53 1 2015-06-17 10:09:53 2 2015-06-17 11:07:53 3 2015-06-17 11:08:53 4 2015-06-17 12:07:53 5 2015-06-17 12:08:53 6
此时,假设我们以确定到小时的时间进行分组进行sum操作,得到的结果表会如下:
操作数据表(TEST):
LOGTIME group_total_num
2015-06-17 10:07:53 1 2015-06-17 10:09:53 3 2015-06-17 11:07:53 3 2015-06-17 11:08:53 7 2015-06-17 12:07:53 5 2015-06-17 12:08:53 11
测试sql如下:
select logtime,sum(num) over(partition by to_char(logtime,‘yyyy-mm-dd-hh24‘) order by logtime) as group_total_num from TEST
标签:
原文地址:http://www.cnblogs.com/feijishuo/p/4582663.html