面试题: Hive-SQL查询连续活跃登录用户思路详解

news2024/12/28 19:12:19

文章目录

    • 创造数据
    • 登录日志去重
  • 一、思路一
    • 1.1、分组排序
    • 1.2、日期减去计数值得到结果, 用户连续登陆情况下,每次相减的结果都相同
    • 1.3、根据 user_id 和 dis 分组,得到用户的 开始、结束时间、连续登录天数
    • 1.4、连续登录超过两天用户
  • 二、思路二: 使用 LAG(向后)或者 LEAD(向前)

连续活跃登陆的用户指至少连续2天都活跃登录的用户

解决类似场景的问题

创造数据

CREATE TABLE test5active(
dt string,
user_id string,
age int)
ROW format delimited fields terminated BY ',';
 
INSERT INTO TABLE test5active VALUES
('2019-02-11','user_1',23),('2019-02-12','user_1',23),('2019-02-11','user_2',19),
('2019-02-11','user_3',39),('2019-02-11','user_1',23),
('2019-02-11','user_3',39),('2019-02-11','user_1',23),
('2019-02-12','user_2',19),('2019-02-13','user_1',23),
('2019-02-15','user_2',19),('2019-02-16','user_2',19);

登录日志去重

因为每天用户登录次数可能不止一次,所以需要先将用户每天的登录日期去重。

select distinct  user_id,dt from test5active

在这里插入图片描述

一、思路一

1、再用row_number() over(partition by _ order by _)函数将用户id分组,按照登陆时间进行排序。

2、计算登录日期减去第二步骤得到的结果值,用户连续登陆情况下,每次相减的结果都相同。

3、按照id和日期分组并求和,筛选大于等于2的即为连续活跃登陆的用户。

1.1、分组排序

SELECT
t1.user_id,
t1.dt,
ROW_NUMBER() OVER(PARTITION BY t1.user_id ORDER BY t1.dt) day_rank
FROM (
 SELECT DISTINCT dt,user_id FROM test5active
)t1;

在这里插入图片描述

1.2、日期减去计数值得到结果, 用户连续登陆情况下,每次相减的结果都相同

SELECT 
    t2.user_id,
    t2.dt,
    date_sub(t2.dt, t2.day_rank) AS dis
FROM ( 
	SELECT 
        t1.user_id,
        t1.dt,
        ROW_NUMBER() OVER(PARTITION BY t1.user_id ORDER BY  t1.dt) day_rank
    FROM 
        (SELECT DISTINCT dt, user_id FROM test5active) t1
)t2;

在这里插入图片描述

1.3、根据 user_id 和 dis 分组,得到用户的 开始、结束时间、连续登录天数

SELECT 
    t3.user_id,
    MIN(t3.dt),
    MAX(t3.dt),
    COUNT(1)
FROM 
    (SELECT 
        t2.user_id,
        t2.dt,
        DATE_SUB(t2.dt, t2.day_rank) AS dis
    FROM 
        (SELECT 
            t1.user_id,
            t1.dt,
            ROW_NUMBER() OVER(PARTITION BY t1.user_id ORDER BY  t1.dt) day_rank
        FROM 
            (SELECT DISTINCT dt, user_id FROM test5active) t1 
    ) t2 
) t3
GROUP BY  t3.user_id,t3.dis

在这里插入图片描述

1.4、连续登录超过两天用户

-- 1.3基础上
HAVING COUNT(1) > 1;

在这里插入图片描述
接下来就是用户去重

二、思路二: 使用 LAG(向后)或者 LEAD(向前)

LEAD(col, n, default) OVER()

  • 说明: 用于统计窗口内向下第n行的值
  • 参数1: 为要取值的列名
  • 参数2: 为向下第n行,默认值为1,这个值是固定的,不能动态的变化
  • 参数3: 为默认值,当向下第n行的值为NULL时,取默认值,如果不指定,则默认值为NULL
SELECT 
    user_id,
    t1.dt,
    LEAD(t1.dt) OVER(PARTITION BY user_id ORDER BY t1.dt) AS last_date_id
FROM 
    (SELECT DISTINCT dt, user_id FROM test5active) t1;

在这里插入图片描述

SELECT DISTINCT t2.user_id
FROM (
    SELECT 
        user_id,
        t1.dt,
        LEAD(t1.dt, 2) OVER(PARTITION BY user_id ORDER BY t1.dt) AS last_date_id
    FROM 
        (SELECT DISTINCT dt, user_id FROM test5active) t1
) t2
WHERE datediff(last_date_id,t2.dt)=1;

这个方法有个弊端,就是 不能找到 超过连续登录xx天的用户,只能通过 LEAD(col, n, default)中的 n 找到确定的 连续登录xx天用户。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/65459.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Rust日报】2022-12-05 探索 docker 的 WASM 技术预览

探索 docker 的 WASM 技术预览docker于近日发布了支持 WASM 容器的预览版本,本文带你体验使用 Rust 编写代码,并且编译成 WASM 最终运行于 docker 的过程.原文链接: https://medium.com/shyamsundarb/exploring-docker-hubs-wasm-technical-preview-76de28c3b1b4使用 Rust 破解…

Matlab学习——变量与档案存取

一、变量 1. char和string MATLAB里面的字符和字符串都是用单引号括起来的。 % 示例:aI like China; n0; for n1:1:size(a,2)b(size(a,2)-n1)a(n); end disp(a); disp(b);% 输出:>> work I like China anihC ekil I >> % 示例&#xff…

Dockerfile的常用指令和构建案例

一、Dockerfile操作常用的指令 (1) FROM 镜像 指定新镜像所基于的基础镜像,第一条指令必须为FROM指令,每创建一个镜像就需要一条FROM指令 (2) MAINTAINER 名字 说明新镜像的维护人信息 (3) RUN命令 在所基于的镜像上执行命令,并提交到新的…

B2B商城交易平台搭建方案为专用设备行业注入新动力,加快产业数字化转型升级

专用设备是指设备的结构、性能专门针对某一种或一类对象,实现一项或几项功能的工业,包括工程机械、光伏设备、锂电设备、3C设备、半导体设备等。近年来,受市场对专用设备的应用需求不断扩大、产业技术升级趋势加快等影响,我国专用…

直播回顾:Coremail校园邮件安全防护交流会暨新技术应用分享

11月23日,Coremail校园邮件安全防护交流会暨新技术应用分享直播举办。 Coremail作为国内TOP级邮件系统厂商,服务上百家高校,特邀以下重磅嘉宾参与了本次圆桌讨论。 本次圆桌会主要探讨校园典型钓鱼邮件防范与新技术在校园邮件中的应用。 高校…

mysql 查询在一张表不在另外一张表的记录

SQL Join子句,主要用在select语句中,把两个或多个表的行结合起来,基于这些表之间的共同字段(往往是id字段)来查询,从多个表中返回满足条件的所有行。 常见join子句类型 常见join子句类型有INNER JOIN(同JOIN)、LEFT JOIN、RIGHT…

【Java学习Note】第8章 多线程

8. 多线程 文章目录8. 多线程8.1 程序、进程、线程8.2 线程的创建8.2.1 继承Thread类-创建线程方法之一8.2.2 Thread常用方法8.2.3 实现Runnable接口-创建线程方法之二8.2.4 两种多线程的区别8.3 线程得调度8.4 线程的生命周期8.5 线程的同步8.5.1 线程同步--Synchronized8.5.2…

html网页设计与制作:基于html设计整套招聘网站求职前端模板页面 静态网页HTML代码 学生网页课程设计期末作业下载

🎉精彩专栏推荐 💭文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 💂 作者主页: 【主页——🚀获取更多优质源码】 🎓 web前端期末大作业: 【📚毕设项目精品实战案例 (10…

联通边缘AI:打造“职业技能”,助力行业高质量发展

内容来源:2022年11月12日,由边缘计算社区主办的全球边缘计算大会上海站圆满落幕。我们非常荣幸邀请到了联通数科首席AI科学家廉士国博士来分享,廉博士是中国图像图形学会三维视觉专委会委员、IEEE智能计算及多媒体通信委员会委员、国家工业互…

WSL VSCode运行C++项目

WSL VSCode运行C项目collect2: error: ld returned 1 exit statusboost库的链接安装并编译boost库:链接库(!!这一步有错误,下面会改正)/usr/include/boost/python/detail/wrap_python.hpp:57:11: fatal error: pyconfig.h: No suc…

RK3588平台开发系列讲解(SARADC篇)SARADC的工作流程

平台内核版本安卓版本RK3588Linux 5.10Android12🚀返回专栏总目录 文章目录 一、SARADC驱动二、SARADC常用接口三、SARADC源码分析1、SARADC驱动注册2、用例分析沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇将介绍SARADC的源码分析和工作流程。 一、SARADC驱…

【Flink】需求实现之独立访客数量的计算 和 布隆过滤器的原理及使用

文章目录一 独立访客数量计算二 布隆过滤器1 什么是布隆过滤器2 实现原理(1)HashMap 的问题(2)布隆过滤器数据结构3 使用布隆过滤器去重一 独立访客数量计算 public static void main(String[] args) throws Exception{StreamExe…

Locust学习记录3-用户类属性【host attribute,tasks attribute】

host attribute(主机属性) host属性是家长主机的URL前缀(即“https://www.baidu.com”)。 这是在Locust的web UI 或命令行上指定的,在Locust【--host】启动时使用该选项 【--host】如果在用户类中声明了一个host属性,那么在命令…

答网友提问 - SAP Business Technology Platform(BTP) 的计费模式

我的知识星球 有朋友向我提问: S4HANA(本地部署或云版)跟SAP家族系统以及非SAP系统的集成,sap的标准/推荐做法是通过BTP还是直接连接,或者是根据目标系统分别选择?有参考链接最好了。 还有BTP的收费模式是什么样的,是不…

业聚医疗通过聆讯:上半年营收6885万美元 钱永勋为实控人

雷递网 雷建平 12月5日血管介入器械公司――业聚医疗集团有限公司(OrbusNeich Medical Group Limited)(简称“业聚医疗”)日前通过聆讯,准备在香港上市。上半年营收6885万美元业聚医疗总部位于中国香港,是一…

springboot解决跨域问题

springboot解决跨域问题 文章目录springboot解决跨域问题一、跨域是什么?二、java解决CORS请求的方式1.返回新的CORSFilter(全局跨域)2.重写WebMvcConfigurer(全局跨域)3.使用注解CorsOrigin4.手动设置响应头&#xff…

如何安装Ambari集群_大数据培训

注意:以下操作主节点操作即可 1 制作本地源 制作本地源是因为在线安装Ambari太慢。制作本地源只需在主节点上进行。 1.1 配置HTTPD 服务 配置HTTPD 服务到系统层使其随系统自动启动 [roothadoop102 ~]# chkconfig httpd on [roothadoop102 ~]# service httpd …

[附源码]Python计算机毕业设计Django网上电影购票系统

项目运行 环境配置: Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术: django python Vue 等等组成,B/S模式 pychram管理等等。 环境需要 1.运行环境:最好是python3.7.7,…

股票量化分析工具QTYX使用攻略——均线系统多头排列选股

搭建自己的量化系统如果要长期在市场中立于不败之地!必须要形成一套自己的交易系统。如何学会搭建自己的量化交易系统?边学习边实战,在实战中学习才是最有效地方式。于是我们分享一个即可以用于学习,也可以用于实战炒股分析的量化…

【软件测试】软件测试工程师职位核心任务?测试人测试职业发展?

目录:导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜)前言 你认为软件测试工程…