查询连续登录天数

  • 1.问题描述
  • 2.在Hive中建表
  • 3.查询最大连续登录天数

1.问题描述

目前有两列数据,分别是用户ID和用户登录的时间,现需要统计用户连续登录的最大天数,中间如有断开,则不算连续,如下图示例。

2.在Hive中建表

在Hive中进行操作,首先启动Hadoop集群环境,进入到Hadoop安装目录,
sbin/start-dfs.shjps查看Hadoop集群有无正常启动

正常启动后,输入hive启动hive。使用之前建立的test数据库,没有可以自行创建一个数据库,在test数据库下新建一个表user_login,这里的日期使用date数据类型

create table user_login(
id int,
login_time date)
row format delimited
fields terminated by ','     --分隔符是逗号
lines terminated by '\n';    --行与行之间使用换行符

建立好表结构后,向该表中到入数据,在root权限下新建一个user_login.txt,使用命令vi user_login.txt,将数据粘贴到user_login.txt中,如下图:

注意数据前后不能有空格,不然导入的数据会变成NULL。使用命令:
load data local inpath '/usr/local/hive/tmp/user_login.txt' overwrite into table user_login;
导入数据到user_login表中,查询一下有无正确导入select * from user_login;,我第一次导的时候因为数据后面有空格,导致导入错误了,后经过修正,没有问题了,如下图:

3.查询最大连续登录天数

下面主要参考了另一位博主的思想。
第一步:使用ROW_NUMBER() 窗口函数 按id分组,按login_time降序排序,得到如下结果

select login_time,id,row_number() over(partition by id) as rank
from user_login
group by login_time,id;


第二步:判断是否连续:用login_time-rank 如果连续则做差后值一样,然后再用id,login_time分组算出每个id下连续的天数,得到如下结果:

SELECT
id,
date_sub(login_time,sort) as login_group,
min(login_time) as start_login_time,
max(login_time) as end_login_time,
count(1) as continuous_days
FROM (SELECT id,login_time,row_number() OVER(PARTITION BY id order by login_time) as sortFROM user_login) a
GROUP BY id,date_sub(login_time,sort);


第三步:再以id分组,取最大的连续登录天数,得到如下结果:

SELECT id,max(continuous_days) as maxdayFROM (SELECT id,date_sub(login_time,sort) as login_group,min(login_time) as start_login_time,max(login_time) as end_login_time,count(1) as continuous_daysFROM (-- 第一段首先根据用户分组,登陆时间排序,结果按照登陆时间升序排列SELECT id,login_time,row_number() OVER(PARTITION BY id order by login_time) as sortFROM user_login) aGROUP BY id,date_sub(login_time,sort))bGROUP BY id;


可以看到已经得到了想要的结果了,在此仅记录一下在Hive中的学习过程,原博客地址见参考

Hive sql : 查询连续登录天数相关推荐

  1. SQL——最大连续登录天数、当前连续登录天数、最大连续未登录天数问题、连续登陆N天用户、连续座位号

    问题: 最大连续登录天数 当前连续登录天数 最大连续未登录天数 连续登陆3天用户(三种方法) 选出连续座位的编号 前三个问题所用数据: 原数据表:user_active表 表字段:用户.新增日期.活跃 ...

  2. SQL(之二)-查询“最长连续登录天数“

    0-创建表及插入测试数据 说明:本文主要想分享,如何查询"最长连续登录天数",具体的测试数据,可以自行添加. CREATE TABLE USER_LOGINFO( USER_ID ...

  3. 非常实用的,使用SQL查询连续号码段。(做计费系统或SP的兄弟经常会用到)...

    非常实用的,使用SQL查询连续号码段.(做计费系统或SP的兄弟经常会用到) 数据库中如何使用SQL查询连续号码段 在[Database吧]上有一则非常巧妙的SQL技巧,学习一下,记录在这里. 最初的问 ...

  4. mysql 连续天数_mysql计算连续天数,mysql连续登录天数,连续天数统计

    mysql计算连续天数,mysql连续登录天数,连续天数统计 >>>>>>>>>>>>>>>>>& ...

  5. mysql 连续七天不登录_使用MySQL窗口函数巧妙的解决用户连续登录天数等问题

    我们在工作中或者面试时,可能会遇到求出用户连续登录天数.连续签到天数等问题,这篇文章就是用窗口函数比较巧妙的解决这个问题的.文章比较长,建议先收藏后观看+_+ 首先是数据准备和处理 如下代码是创建用户 ...

  6. mysql 连续登录天数

    已知表名:csdata,表中有两个字段:user_id,log_time 问:用户连续登录天数为3的是?. user_id log_time 111111 2022/12/12 00:00:00 11 ...

  7. oracle号码段拆开,学习-SQL查询连续号码段的巧妙解法

    学习-SQL查询连续号码段的巧妙解法 在ITPUB上有一则非常巧妙的SQL技巧,学习一下,记录在这里. 最初的问题是这样的:我有一个表结构, fphm,kshm 2014,00000001 2014, ...

  8. 每个用户连续登录天数

    id dt 1001 2022-05-01 1001 2022-05-02 1001 2022-05-04 1001 2022-05-05 1001 2022-05-08 1001 2022-05-1 ...

  9. 使用Hive SQL查询Iceberg表的正确姿势

    本文首发微信公众号:码上观世界 Iceberg作为一种表格式管理规范,其数据分为元数据和表数据.元数据和表数据独立存储,元数据目前支持存储在本地文件系统.HMS.Hadoop.JDBC数据库.AWS ...

最新文章

  1. 《研磨设计模式》chap3 外观模式Facade
  2. 重新洗牌的网约车,谁在接管下沉市场?
  3. Struts 2杂谈(2):如何向标签文件中的Struts 2标签传递参数值
  4. spark中stage的划分与宽依赖/窄依赖(转载+自己理解/整理)
  5. Python基础项目实践之:面向对象方法实现模拟银行管理系统
  6. C++ 嵌套类与局部类
  7. 人人都能懂的Vue源码系列—08—initLifecycle
  8. 如何查询计算机主机序列号,计算机硬盘序列号如何查询
  9. Android学习计划[转载Sammy_Snail]
  10. ES文件浏览器(清理垃圾神器, 强大网盘管理功能, 强大文件分析能力)
  11. 6月6日重庆 减肥美容、无痕线雕提升技术精品班 (顾春英)
  12. Java操作sqlite3数据库心得(一)
  13. 云南计算机专修学校附中,云南昆明这四所重点中学,师资力量雄厚,教学经验丰富!...
  14. [计算机网络] 实验 5 电子邮件
  15. 《国度》之大学者联盟全解
  16. 这世界风华正茂可别辜负好时光
  17. android无法接收短信广播,Android BroadcastReceiver接收收到短信的广播
  18. 1.密码学概念及古典密码
  19. golang操作mongo
  20. 禁用Windows10系统驱动程序强制签名的简单方法

热门文章

  1. Lake Counting S
  2. php匹配字符串中的url并替换为超链接
  3. 网易云信智码超清转码技术实践
  4. Hyperledger Fabric2中文文档-修改通道配置
  5. 教你如何用Unity和Cardboard把3D游戏做成VR游戏
  6. 爱普生Epson LQ-680K 打印机驱动
  7. 【三维概念】【Cesium】 Camera控制-视角-roll,pitch,heading的含义
  8. QGIS编译(跨平台编译)之三十九:QCA编译、QCA安装(Windows、Linux、MacOS环境下编译、安装)
  9. 触控板失灵的解决方法(synaptics驱动)
  10. 制作的自媒体短视频很模糊?教你3个方法,让视频变清晰