HIVESQL随笔---01

题目:

用户访问数据

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值