码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2015-06-17 13:20:01      阅读:111      评论:0      收藏:0      [点我收藏+]

标签:

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!