各时间点拥有新增用户数趋势

场景:假设现在要分析某天每小时新增累加的一个上升趋势,即在各个时间点拥有的新增用户数的一个趋势。用户明细表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

 

posted on 2015-06-17 11:02  飞机说之代码也疯狂  阅读(375)  评论(0编辑  收藏  举报