HQL解决连续三天登陆问题

这篇具有很好参考价值的文章主要介绍了HQL解决连续三天登陆问题。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.背景

统计连续登录天数超过3天的用户,输出信息包括:用户id,登录天数,起始时间,结束时间;

2.准备数据

-- 建表
create table if not exists user_login_3days(
    user_id STRING,
    login_date date
);

--插入数据
insert into user_login_3days values ('01','2023-08-02');
insert into user_login_3days values ('01','2023-08-03');
insert into user_login_3days values ('01','2023-08-04');
insert into user_login_3days values ('01','2023-11-02');
insert into user_login_3days values ('01','2023-12-09');
insert into user_login_3days values ('02','2023-01-01');
insert into user_login_3days values ('02','2023-04-23');
insert into user_login_3days values ('03','2023-09-10');
insert into user_login_3days values ('03','2023-09-11');
insert into user_login_3days values ('03','2023-09-12');
insert into user_login_3days values ('04','2023-04-23');
insert into user_login_3days values ('04','2023-04-24');
insert into user_login_3days values ('05','2023-09-11');
insert into user_login_3days values ('06','2023-09-12');

-- 查询数据数据
select * from user_login_3days order by user_id;

HQL解决连续三天登陆问题,大数据,hive,hadoop,数据仓库

3.解决思路以及实现

思路1:row_number()

  • 1.通过对用户id进行开窗函数row_number,对登陆时间进行降序排列
  • 2.使用date_sub(login_date,rn)函数进行日期求出差值日期
  • 3.对user_id和diff_date分组求出时间的区间范围
  • 4.对结果进行过滤操作
SELECT
 t2.user_id,
 count(1)           as login_times,
 min(t2.login_date) as start_date,
 max(t2.login_date) as end_date
FROM
(
    SELECT
     t1.user_id,
     t1.login_date,
     date_sub(t1.login_date,rn) as diff_date
    FROM
    (
        SELECT
         user_id,
         login_date,
         row_number() over(partition by user_id order by login_date asc) as rn
        FROM user_login_3days
    ) t1
) t2
group by t2.user_id, t2.diff_date
having login_times >= 3;

思路2:lag()/lead()

  • 1.通过对用户id进行开窗函数lag/lead,求出前面第二个的日期与当前的日期差以及后面一个日期与当前日期的差值
  • 2.对结果进行过滤操作
SELECT
  user_id,
  lag_login_date,
  login_date
FROM
      (SELECT
         user_id,
         login_date,
         lag(login_date,2,login_date) over(partition by user_id order by login_date) as lag_login_date,
         lead(login_date,1,login_date) over(partition by user_id order by login_date) as lead_login_date
      FROM user_login_3days
      ) t1
where datediff(login_date,lag_login_date) =2

4.总结

连续登陆问题解决的关键在于:如何判断连续?
通过对user_id分组排序后,使用登陆日期减去序号rn。如果连续,则得到的这个日期会相同。文章来源地址https://www.toymoban.com/news/detail-671849.html

到了这里,关于HQL解决连续三天登陆问题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • hql、数据仓库、sql调优、hive sql、python

    HQL(Hibernate Query Language) 是面向对象的查询语言 SQL的操作对象是数据列、表等数据库数据 ; 而HQL操作的是类、实例、属性 数据仓库的定义 英文名称为Data Warehouse,可简写为DW或DWH。 为企业级别的决策制定过程,提供所有类型数据支持的战略集合。 它出于分析性报告和决策支持

    2024年02月03日
    浏览(49)
  • 【大数据之Hive】十三、Hive-HQL函数之单行函数和高级聚合函数

      Hive内置函数:单行函数、聚合函数、炸裂函数、窗口函数。   单行函数的特点是一进一出,即输入一行,输出一行;包括算数运算函数、数值函数、字符串函数、日期函数、流程控制函数、集合函数等。 3.1 substring 截取字符串 语法: 3.2 replace 全局替换 语法: 3.3 re

    2024年02月09日
    浏览(38)
  • 【Hive_06】企业调优2(数据倾斜优化、HQL优化等)

    数据倾斜问题,通常是指参与计算的数据分布不均,即某个key或者某些key的数据量远超其他key,导致在shuffle阶段,大量相同key的数据被发往同一个Reduce,进而导致该Reduce所需的时间远超其他Reduce,成为整个任务的瓶颈。 比如对于一张表的province_id字段,其中99%的值都为1,则

    2024年01月16日
    浏览(30)
  • 【大数据之Hive】二十五、HQL语法优化之小文件合并

      小文件优化可以从两个方面解决,在Map端输入的小文件合并,在Reduce端输出的小文件合并。   合并Map端输入的小文件是指将多个小文件分到同一个切片中,由一个Map Task处理,防止单个小文件启动一个Map Task,造成资源浪费。 相关参数:   合并Reduce端输出的小文件是

    2024年02月13日
    浏览(29)
  • Hive SQL必刷练习题:连续问题 & 间断连续(*****)

    1) 连续问题:找出连续三天(或者连续几天的啥啥啥)。 2) 间断连续:统计各用户连续登录最长天数,间断一天也算连续,比如1、3、4、6也算登陆了6天 这两类问题,都是涉及到连续,只不过连续类问题只要判断出来相邻的时间是和当前行的时间挨着即可,而间断连续,

    2024年03月27日
    浏览(42)
  • hive on spark hql 插入数据报错 Failed to create Spark client for Spark session Error code 30041

    离线数仓 hive on spark 模式,hive 客户端 sql 插入数据报错 Failed to execute spark task, with exception \\\'org.apache.hadoop.hive.ql.metadata.HiveException(Failed to create Spark client for Spark session 50cec71c-2636-4d99-8de2-a580ae3f1c58)\\\' FAILED: Execution Error, return code 30041 from org.apache.hadoop.hive.ql.exec.spark.SparkTask. Failed t

    2024年02月14日
    浏览(41)
  • HIVE SQL 中 HQL 语句理解

         HQL DQL指的是 数据查询语句, 主要是对 表数据进行查询操作的. MySQL中 单表查询语句 完整格式如下:     select distinct 列1, 列2... from 表名     where 组前筛选     group by 分组字段     having 组后筛选     order by 排序字段 [asc/desc]     limit 起始索引, 数据条数; Hive中 单表

    2024年01月25日
    浏览(68)
  • 【Hive】HQL Array 『CRUD | 相关函数』

    语法: array基本数据类型 注意是 ,不是 () 例子: 创建表时: 字段填充时: cast(null as arraystring) as XXX 没有删除,只能覆盖 注意:数组越界会报错。 array() :创建一个数组。例如,array(1,2,3)将创建一个包含1、2、3三个元素的数组。 array_max(array) :返回数组中的最大值。例如,

    2024年02月11日
    浏览(26)
  • 【Hive】HQL Map 『CRUD | 相关函数』

    语法: map基本数据类型, 基本数据类型 注意是 ,不是 () 例子: 创建表时: 字段填充时: cast(null as mapstring, string) as XXX 没有删除,只能覆盖 只能 overwrite 覆盖 注意:如果查找不存在的键值对,会返回 null 值 map_keys(map_name) :获取该map的所有key,结果是一个Array。 map_keys(map

    2024年02月09日
    浏览(35)
  • hql(hive sql)中的join及踩过的坑

    1 几种join方式 join join 对应于 inner join 内连接。 当多张表进行 join 的时候,所有表中与 on 条件中匹配的数据才会显示。 hql (即 hive sql )的 on 子句中只支持 and ,不支持 or ,也不支持 null 的对比。 left outer join 左外连接,也称为左连接。 以左表为基准,如果右表有条件匹配

    2024年01月21日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包