【Hive SQL 每日一题】统计用户连续下单的日期区间

文章目录

测试数据

sql 复制代码
create table test(user_id string,order_date string);

INSERT INTO test(user_id, order_date) VALUES('101', '2021-09-21'),('101', '2021-09-22'),('101', '2021-09-23'),('101', '2021-09-27'),('101', '2021-09-28'),('101', '2021-09-29'),('101', '2021-09-30'),('102', '2021-10-01'),('102', '2021-10-02'),('102', '2021-10-05'),('102', '2021-10-06'),('102', '2021-10-07'),('106', '2021-10-04'),('106', '2021-10-05'),('106', '2021-10-08'),('107', '2021-10-05'),('107', '2021-10-06');

需求说明

统计用户连续下单的日期区间,所以连续的下单日期必须 >= 2,例如:2023-01-01,2023-01-02

分析步骤如下:

  1. user_idorder_date 进行分组,同天的下单日期只保留一条。

  2. 使用 row_number 窗口函数对行号进行标记。

  3. 使用 date_sub 函数与行号标记进行运算,如果数据连续的话,那么运算后的日期必然是一样的。

  4. user_iddate_sub 运算后日期进行分组,过滤数量 < 2 的分组,最大值与最小值日期统计。

需求实现

sql 复制代码
select
    user_id,
    min(order_date) order_start_date,
    max(order_date) order_end_date
from
    (select
        user_id,
        order_date,
        date_sub(order_date,rn) same_day
    from
        (select
            user_id,
            order_date,
            row_number() over (partition by user_id order by order_date) rn
        from
            test
        group by
            user_id,
            order_date )t1 -- 分组后进行行号标记
       )t2 -- 使用日期和行号进行运算
group by
    user_id,same_day
having
    count(user_id) >= 2;

输出结果

解决这题的关键是使用 row_number 窗口函数进行行号标记,然后和 date_sub 进行运算,如果日期是连续的,那么运算结果得到的日期就是一致的,如下所示:

sql 复制代码
date		rn
2023-05-04 	1
2023-05-05 	2
2023-05-06 	3

运算后,日期结果都为 2023-05-03,显然该日期是连续的,利用这一特性完成该需求。

相关推荐
AllData公司负责人10 分钟前
实时开发平台(Streampark)--Flink SQL功能演示
大数据·前端·架构·flink·开源
小坏讲微服务2 小时前
MaxWell中基本使用原理 完整使用 (第一章)
大数据·数据库·hadoop·sqoop·1024程序员节·maxwell
百***62854 小时前
MySQL 常用 SQL 语句大全
数据库·sql·mysql
百***6974 小时前
MySQL数据库(SQL分类)
数据库·sql·mysql
勇往直前plus4 小时前
ElasticSearch详解(篇一)
大数据·elasticsearch·jenkins
影子24015 小时前
oralce创建种子表,使用存储过程生成最大值sql,考虑并发,不考虑并发的脚本,plsql调试存储过程,java调用存储过程示例代码
java·数据库·sql
武子康5 小时前
Java-172 Neo4j 访问方式实战:嵌入式 vs 服务器(含 Java 示例与踩坑)
java·服务器·数据库·sql·spring·nosql·neo4j
一只小青团7 小时前
Hadoop之HDFS
大数据·hadoop·分布式
ITVV7 小时前
hadoop-3.4.1 单机伪部署
大数据·linux·hadoop
小鹿学程序7 小时前
4.子任务四:Hive 安装配置
数据仓库·hive·hadoop