Hive 查询有连续三天销售记录的销售报表

该博客介绍了一种利用Hive查询有连续三天销售记录的策略。通过row_number函数对shopid分区并按时间升序排列,再用date_sub计算相邻日期,将连续的日期分组并筛选出成员数不少于3的组,以此来获取销售报表。

数据:

求解思路:

             使用row_number函数打标记根据shopid分区,以time升序排列,根据date_sub(to_date(time),flag)生成对应日期

              比如A分区中的五号标记和六号标记,如果根据data_sub生成的日期是一致的,那么这两天就是相邻的

             eg:   五号标记   2015-3-21  那么她生成的日期就是21-5 =2015-3-16

                      六号标记   2015-3-22  那么她生成的日期就是2015-3-16

              然后根据生成的日期和shopid分组,查出组中的成员数目大于等于三的就得到了结果

第一步:打标记</

Hive 中实现连续三天登录统计有多种方法,以下为你详细介绍: ### 方法一:使用 LEAD 函数和公共表达式(CTE) 这种方法利用公共表达式(CTE)复用查询结果,借助 `lead` 函数获取第三天日期,并与通过 `date_add` 计算得到的第三天日期作比较,以此判断是否为连续登录三天的起始日期。示例代码如下: ```sql -- 第一步:使用 CTE 查询每个用户登录日期及第三天的日期 with t as ( select *, lead(dt, 2) over(partition by id order by dt) later3dt, date_add(dt, 2) true3dt from user_log ), -- 第二步:判断是否为连续登录三天的起始日期 t1 as ( select *, if(later3dt == true3dt, 1, 0) num from t ) -- 第三步:筛选出连续登录三天记录 select * from t1 where num = 1; ``` 在上述代码里,`user_log` 是存储用户登录记录的表,`id` 代表用户 ID,`dt` 表示登录日期。通过 `lead` 函数得到第三天的日期 `later3dt`,用 `date_add` 计算出第三天的日期 `true3dt`,若二者相等,则表明这是连续登录三天的起始日期,标记为 1,最后筛选出标记为 1 的记录 [^3]。 ### 方法二:利用等差数列 此方法借助等差数列求出所有用户的连续登录时间,然后直接进行选择过滤。示例代码如下: ```sql select user_id, max(t4.num) log_date from ( select user_id, count(date_no1) num from ( select user_id, create_date, rk, date_sub(create_date, rk) date_no1 from ( select user_id, create_date, rank() over (partition by user_id order by create_date) rk from ( select distinct user_id user_id, create_date from order_info ) t1 ) t2 ) t3 group by user_id, date_no1 ) t4 group by user_id having max(t4.num) >= 3; ``` 在这段代码中,`order_info` 是存储用户登录记录的表,`user_id` 是用户 ID,`create_date` 为登录日期。首先筛选出所有用户的登录时间并按用户 ID 去重,接着用 `rank` 函数为每个用户的日期打序号,再用登录时间减去序号得出新的时间,之后对新时间分组求和,取最大值,最后筛选出连续登录天数大于等于 3 的用户 [^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值