HiveSQL题——用户连续登陆

目录

一、连续登陆

1.1 连续登陆3天以上的用户

0 问题描述

1 数据准备

2 数据分析

3 小结

1.2 每个用户历史至今连续登录的最大天数

0 问题描述

1 数据准备

2 数据分析

3 小结

1.3 每个用户连续登录的最大天数(间断也算)

0 问题描述

1 数据准备

2 数据分析

3 小结


一、连续登陆

1.1 连续登陆3天以上的用户

0 问题描述

 查询连续登陆3天以上的用户(字节面试题)

1 数据准备

create table if not exists  table1  (id int comment '用户id', `date` string comment'用户登录时间');insert overwrite table table1 values
(1,'2019-01-01 19:28:00'),
(1,'2019-01-02 19:53:00'),
(1,'2019-01-03 22:00:00'),
(1,'2019-01-05 20:55:00'),
(1,'2019-01-06 21:58:00'),
(2,'2019-02-01 19:25:00'),
(2,'2019-02-02 21:00:00'),
(2,'2019-02-04 22:05:00'),
(2,'2019-02-05 20:59:00'),
(2,'2019-02-06 19:05:00'),
(3,'2019-03-04 21:05:00'),
(3,'2019-03-05 19:10:00'),
(3,'2019-03-06 19:55:00'),
(3,'2019-03-07 21:05:00');

2 数据分析

selectdistinct id
from (selectid,difffrom (selectid,date_sub(dt, row_number()over (partition by id order by dt)) difffrom (  --- 同一个用户一天可能登陆多次,所以,先去重selectid,date_format(`date`,'yyyy-MM-dd') as dtfrom table1-- current_date() 获取当前的年月日where date_format(`date`,'yyyy-MM-dd') between date_sub(current_date(),7) and current_date()group by id, date_format(`date`,'yyyy-MM-dd')) tmp1) tmp2group by id, diffhaving count(1) >= 3) tmp3;

3 小结

   “连续登陆”类型的解题思路:

(1)计算 date_sub(login_date,row_number() over (user_id oder by  login_date)) diff;

(2)group by user_id,diff 分组;

(3)count(1) >= 3天的用户就是连续登陆3天及以上的用户 

1.2 每个用户历史至今连续登录的最大天数

0 问题描述

 查询每个用户历史至今连续登录的最大天数

1 数据准备

create table if not exists  table1  (id int comment '用户id', `date` string comment'用户登录时间');insert overwrite table table1 values
(1,'2019-01-01 19:28:00'),
(1,'2019-01-02 19:53:00'),
(1,'2019-01-03 22:00:00'),
(1,'2019-01-05 20:55:00'),
(1,'2019-01-06 21:58:00'),
(2,'2019-02-01 19:25:00'),
(2,'2019-02-02 21:00:00'),
(2,'2019-02-04 22:05:00'),
(2,'2019-02-05 20:59:00'),
(2,'2019-02-06 19:05:00'),
(3,'2019-03-04 21:05:00'),
(3,'2019-03-05 19:10:00'),
(3,'2019-03-06 19:55:00'),
(3,'2019-03-07 21:05:00');

2 数据分析

selectid,max(cnt) as days
from (selectid,count(1) as cntfrom (selectid,`date`,date_sub(`date`, row_number() over (partition by id order by `date`)) difffrom (--用户在同一天可能登录多次,需要去重selectid,date_format(`date`, 'yyyy-MM-dd') as `date`from table1group by id, date_format(`date`, 'yyyy-MM-dd')) tmp1) tmp2group by id, diff) tmp3
group by id;

3 小结

 “连续登陆”类型的解题思路:

(1)计算 date_sub(login_date,row_number() over (user_id oder by  login_date)) diff;

(2)group by user_id,diff 分组;

(3)max(cnt)得到就是每个用户历史至今连续登陆的 最大天数。

1.3 每个用户连续登录的最大天数(间断也算)

0 问题描述

  统计各用户最长的连续登录天数,间断一天也算作连续。例如:一个用户在1,3,5,6号登录,则视为连续6天登录。

1 数据准备

create table if not exists  table1  (id int comment '用户id', `date` string comment'用户登录时间');insert overwrite table table1 values
(1,'2019-01-01 19:28:00'),
(1,'2019-01-02 19:53:00'),
(1,'2019-01-03 22:00:00'),
(1,'2019-01-05 20:55:00'),
(1,'2019-01-06 21:58:00'),
(2,'2019-02-01 19:25:00'),
(2,'2019-02-02 21:00:00'),
(2,'2019-02-04 22:05:00'),
(2,'2019-02-05 20:59:00'),
(2,'2019-02-06 19:05:00'),
(3,'2019-03-04 21:05:00'),
(3,'2019-03-05 19:10:00'),
(3,'2019-03-06 19:55:00'),
(3,'2019-03-07 21:05:00');

2 数据分析

  方式一:间断的那一天,构造array数组,利用炸裂函数进行补全,然后按照“用户连续登陆”的思路来做。

selectid,max(cnt) as days
from (selectid,diff,count(1) as cntfrom (selectid,login_date,next_login_date,arr,new_login_date,date_sub(new_login_date, row_number() over (partition by id order by new_login_date)) difffrom (selectid,login_date,next_login_date,arr,new_login_datefrom (selectid,login_date,next_login_date,--间断的那一天,构造array数组,利用炸裂函数进行补全if(datediff(next_login_date, login_date) = 2,array(login_date, date_add(login_date, 1)),array(login_date)) as arrfrom (selectid,login_date,--窗口函数 lead(向后取n行)--lead(column1,n,val)over(partition by column2 order by column3) 查询当前行的后边第n行数据,如果没有就为nulllead(login_date, 1, '9999-12-31')over (partition by id order by login_date) next_login_datefrom (--用户在同一天可能登录多次,需要去重selectid,date_format(`date`, 'yyyy-MM-dd') as login_datefrom table1group by id, date_format(`date`, 'yyyy-MM-dd')) tmp1) tmp2) tmp3lateral view explode(arr) tmp as new_login_date) tmp4) tmp5group by id, diff) tmp6
group by id;
方式二:对用户多段stage的连续登陆进行划分,思路类似:会话划分
selectid,max(diff) as days
from (selectid,stage,datediff(max(login_date), min(login_date)) + 1 as difffrom (selectid,login_date,-- 思路类似:会话划分,字符串拼接得到stageconcat(id, '-', sum(start_point)over (partition by id order by login_date rows between unbounded preceding and current row )) stagefrom (selectid,login_date,--间隔一天也算连续,所以差值大于2的数据打上标签if(datediff(login_date, last_login_date) > 2, 1, 0) start_pointfrom (selectid,login_date,--窗口函数 lag(向前取n行)--lag(column1,n,val)over(partition by column2 order by column3) 查询当前行的前边第n行数据,如果没有就为nulllag(login_date, 1, '1970-01-01')over (partition by id order by login_date) as last_login_datefrom (selectid,date_format(`date`, 'yyyy-MM-dd') as login_datefrom table1group by id, date_format(`date`, 'yyyy-MM-dd')) tmp1) tmp2) tmp3) tmp4group by id, stage) tmp5
group by id;

3 小结

 “间断连续”类型的解题思路:

(1)构造array数组;

 (2)炸裂函数+ 侧写视图 : lateral view +explode将一行变多行,补全间断的那几天

 (3)补全后之后就按照“连续登陆”的情景进行处理

  • 计算 date_sub(login_date,row_number() over (user_id oder by  login_date)) diff;
  • group by user_id,diff 分组;
  • max(cnt)得到就是每个用户历史至今连续登陆的最大天数。

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

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

相关文章

qt信号与槽机制及使用demo

要在 Qt 中将 rclcomm 类与 MainWindow 连接,并使用 rcl->pose_uids 中的项更新 comboBox_model,您可以按照以下步骤操作: 信号与槽机制:Qt 使用信号和槽机制来处理事件和对象间通信。您可以在 rclcomm 类中定义一个信号&#…

MySQL-窗口函数 简单易懂

窗口函数 考查知识点: • 如何用窗口函数解决排名问题、Top N问题、前百分之N问题、累计问题、每组内比较问题、连续问题。 什么是窗口函数 窗口函数也叫作OLAP(Online Analytical Processing,联机分析处理)函数,可…

Python入门知识点分享——(十七)正则表达式和re模块

不好意思鸽了这么久,这几天备赛美赛没有太多时间写博客。好了闲话少叙,这次为大家带来的是正则表达式的相关介绍。正则表达式又叫做规则表达式,英文全称Regular Expression。是一种对字符串操作的逻辑公式,就是用事先定义好的一些特定字符、及…

RK3568平台 of 操作函数获取属性

一.of 操作函数获取属性 of_find_property 函数,用于在设备树中查找节点 下具有指定名称的属性。 struct property *of_find_property(const struct device_node *np, const char *name, int*lenp)np: 要查找的节点。 name: 要查找的属性的属性名。 lenp: 一个指…

Android 基础技术——列表卡顿问题如何分析解决

笔者希望做一个系列,整理 Android 基础技术,本章是关于列表卡顿问题如何分析解决 onBindViewHolder 优化 是否有耗时操作、重复创建对象、设置监听器、findViewByID、局部的动画对象等操作 是否存在内存泄漏 发生内存泄露,会导致一些不再使用…

游戏开发丨基于Tkinter的扫雷小游戏

文章目录 写在前面扫雷小游戏需求分析程序设计程序分析运行结果系列文章写在后面 写在前面 本期内容 基于tkinter的扫雷小游戏 所需环境 pythonpycharm或anaconda 下载地址 https://download.csdn.net/download/m0_68111267/88790713 扫雷小游戏 扫雷是一款广为人知的单…

RabbitMQ“延时队列“

1.RabbitMQ"延时队列" 延迟队列存储的对象是对应的延迟消息,所谓“延迟消息”是指当消息被发送以后,并不想让消费者立刻拿到消息,而是等待特定时间后,消费者才能拿到这个消息进行消费 注意RabbitMQ并没有延时队列慨念,…

【ArcGIS微课1000例】0097:栅格重采样(以数字高程模型dem为例)

Contents 1. 最邻近法(Nearest Neighbor)2. 双线性内插法(Bilinear Interpolation)3. 三次卷积法(Cubic Convolution)4. ArcGIS重采样工具(Resample)5. 注意事项栅格/影像数据进行配准或纠正、投影等几何变换后,像元中心位置通常会发生变化,其在输入栅格中的位置不一…

OpenCV-29 自适应阈值二值化

一、引入 在前面的部分我们使用的是全局阈值,整幅图像采用同一个数作为阈值。当时这种方法并不适应于所有情况。尤其是当同一幅图像上的不同部分具有不同的亮度时。这种情况下我们需要采用自适应阈值。此时的阈值时根据图像上的每一个小区域计算与其对应的阈值。因此…

com.spring4all:swagger-spring-boot-starter:1.7.1.RELEASE导致,项目启动出错

Springboot 启动出错如下: Exception in thread "main" java.lang.NoSuchMethodError: org.springframework.util.Assert.isInstanceOf(Ljava/lang/Class;Ljava/lang/Object;Ljava/util/function/Supplier;)Vat org.springframework.boot.logging.logbac…

【幻兽帕鲁】开服务器,高性能高带宽(100mbps),免费!!!【学生党强推】

【幻兽帕鲁】开服务器,高性能高带宽(100mbps),免费!!!【学生党强推】 教程相关视频地址:https://www.bilibili.com/video/BV16e411Y7Fd/ 目前幻兽帕鲁开服务器有以下几套比较性价比的…

Python编程技巧 – 函数参数

Python编程技巧 – 函数参数 Python Programming Skills - Functional Parameters 1. 函数的定义 函数有简明扼要的定义。 函数是一个代码块,仅在调用时运行。可以将数据(称为参数)传递到函数中。函数可以返回数据作为结果。 2. 函数的结…

【Vue】为什么Vue3使用Proxy代替defineProperty?

先来看看 Vue2 中 defineProperty 来操作数据: const obj {a: 1,b: 2,c: {a: 1,b: 2} } function _isObject(v) {return typeof v object && v ! null; } function observe(object) {for (let key in object) {let v object[key];if (_isObject(v)) {ob…

研发日记,Matlab/Simulink避坑指南(九)——可变数组应用Bug

文章目录 前言 背景介绍 问题描述 分析排查 解决方案 总结归纳 前言 见《研发日记,Matlab/Simulink避坑指南(四)——transpose()转置函数Bug》 见《研发日记,Matlab/Simulink避坑指南(五)——CAN解包 DLC Bug》 见《研发日记,Matlab/Si…

Hive之set参数大全-19

指定用于计算列的唯一值数(NDV,即基数)的算法 在 Hive 中,hive.stats.ndv.algo 是一个配置参数,用于指定用于计算列的唯一值数(NDV,即基数)的算法。以下是有关该参数的一些解释&…

计算机网络之ARP协议

ARP(地址解析协议,Address Resolution Protocol)是一种用于在网络中解析或确定目标主机的物理地址(如以太网MAC地址)的网络协议。ARP主要用于IPv4网络,它使得设备能夠在知道目标设备的IP地址的情况下找到其…

qemu + vscode图形化调试linux kernel

一、背景 使用命令行连接gdb 在调试时,虽然可以通过tui enable 显示源码,但还是存在设置断点麻烦(需要对着源码设置),terminal显示代码不方便,不利于我们学习;另外在gdb 下p命令显示结构体内容…

重构改善既有代码的设计-学习(六):处理继承关系

1、函数上移(Pull Up Method) 无论何时,只要系统内出现重复,你就会面临“修改其中一个却未能修改另一个”的风险。通常,找出重复也有一定的难度。 所以,某个函数在各个子类中的函数体都相同(它们…

Pandas--数据结构 - Series(3)

Pandas Series 类似表格中的一个列(column),类似于一维数组,可以保存任何数据类型。 Series 特点: 索引: 每个 Series 都有一个索引,它可以是整数、字符串、日期等类型。如果没有显式指定索引&…

Android Automotive:在路上释放 Android 操作系统的力量

Android Automotive:在路上释放 Android 操作系统的力量 Android 在汽车行业的历程车载信息娱乐系统 (IVI) 的演变汽车中的 Android:演变和进步Android 汽车操作系统的崛起Polestar 2:开创 Android 汽车体验Android 开源项目 (AOSP) 及其他项…