Hive 刷题——连续签到送金币

需求描述

用户每天签到可以领1金币,并可以累计签到天数,连续签到的第3、7天分别可以额外领2和6金币。
每连续签到7天重新累积签到天数。
从用户登录明细表中求出每个用户金币总数,并按照金币总数倒序排序

结果如下:

user_id
<string>
(用户id)
sum_coin_cn
<bigint>
(金币总数)
101 7
109 3
107 3
102 3
106 2
104 2
103 2
1010 2
108 1
105 1

需要用到的表:

用户登录明细表:user_login_detail

user_id(用户id)ip_address(ip地址)login_ts(登录时间)logout_ts(登出时间)
101 180.149.130.161 2021-09-21 08:00:00 2021-09-27 08:30:00
102 120.245.11.2 2021-09-22 09:00:00 2021-09-27 09:30:00
103 27.184.97.3 2021-09-23 10:00:00 2021-09-27 10:30:00

 

参考实现

select user_id, sum(case when rn = 3 then 3 when rn = 7 then 7 else 1 end) sum_coin_cn
from (select user_id, next_date, row_number() over (partition by user_id,next_date order by rn) rn
      from (select user_id, login_date, rn, date_sub(login_date, rn) next_date
            from (select user_id, login_date, row_number() over (partition by user_id order by login_date) rn
                  from (select user_id, date(login_ts) login_date
                        from user_login_detail
                        group by user_id, date(login_ts)) y) y) t) t
group by user_id;
posted @ 2023-02-19 08:44  晓枫的春天  阅读(87)  评论(0编辑  收藏  举报