题目:
用户访问数据
userId | visitDate | visitCount |
u01 | 2017/1/21 | 5 |
u02 | 2017/1/23 | 6 |
u03 | 2017/1/22 | 8 |
u04 | 2017/1/20 | 3 |
u01 | 2017/1/23 | 6 |
u01 | 2017/2/21 | 8 |
U02 | 2017/1/23 | 6 |
U01 | 2017/2/22 | 4 |
使用SQL统计出每个用户的累积访问次数,如下表所示:
用户id | 月份 | 小计 | 累积 |
u01 | 2017-01 | 11 | 11 |
u01 | 2017-02 | 12 | 23 |
u02 | 2017-01 | 12 | 12 |
u03 | 2017-01 | 8 | 8 |
u04 | 2017-01 | 3 | 3 |
SQL:
select
user_id `用户id`,
yn `月份`,
nums `小计`,
sum(nums) over(partition by user_id order by yn asc rows between unbounded preceding and current row ) `累计`
from
(select
user_id,yn,
sum(visit_count) nums
from (select
user_id,
date_format(regexp_replace(visit_date,'/','-'),'yyyy-MM') yn,
visit_count
from users)t1
group by user_id,yn)t2;
关键点:
1、date_format(xxxx/xx/xx,’yyyy-MM-dd hh:mm:ss ’)的用法;
2、regexp_replace(字段/段落,被替换内容,待写入内容):(内容可以用正则表达式来匹配)的用法;
3、group by的用法--可以多个联合分组的哦;(更有grouping sets的用法详见官网:Enhanced Aggregation, Cube, Grouping and Rollup - Apache Hive - Apache Software Foundation 搜索grouping sets即可)
4、在hive中想要表起别名为中文,必须要将中文别名放置于反单引号内(就是tab上面的那个键)才能生效
5、可能有人有疑惑:为啥还用rows between...而不是直接不写?解析:其实开窗函数over()中使用rows between unbounded preceding and current row 是由于hive本身的开窗函数over()中默认为以range(以值为准)为基准,而不是rows,所以如果我不写rows between...,那么这个时候,默认为range between ...
这个时候,如果碰到问题:累计的时候遇见重复的累计的时候就会以最后一行相同的值为准,所以就会产生俩行累计的值相同,但是却是最后那个值,看到这不懂了吧!那就对了(之后用道例题解析),直接上官网:LanguageManual WindowingAndAnalytics - Apache Hive - Apache Software Foundation