Hive_sql如何计算连续签到天数

在a表中有id和date两列,记录用户当天是否签到,想查询出哪些用户连续签到了3天(或连续签到更多天,是连续签到)

(1) 先开窗,排个序:

sql 复制代码
select user_id, login_time,
row_number() over(partition by user_id order by login_time) num 
from login_log;

开完窗的结果如下:

(2) 利用等差数列的特性,如果是连续登录,login_time - num 则相等,因此可以这样写:

sql 复制代码
select t.user_id, 
    t.login_time, 
    date_sub(login_time, INTERVAL t.num DAY) date_rslt
from 
(
    select user_id, login_time, 
    row_number() over(partition by user_id order by login_time) num 
    from login_log
) t;

注:INTERVAL 关键字可以用于计算时间间隔, date_sub(login_time, INTERVAL t.num DAY)表示登录时间减去 num 天; 若 DAY 改成 HOUR 表示减去 num 小时。

以上 SQL 执行后得到:

(3)分组后可获得结果:

sql 复制代码
select a.user_id,
    a.date_rslt,
    count(1) as cnt
from(
    select 
        t.user_id, 
        t.login_time,
        date_sub(login_time, INTERVAL t.num DAY) date_rslt
    from 
        (
        select user_id, 
        login_time, 
        row_number() over(partition by user_id order by login_time) num 
        from login_log
        ) t
) a
group by a.user_id, a.date_rslt;
相关推荐
Mr_Xuhhh4 小时前
MySQL函数详解:日期、字符串、数学及其他常用函数
java·数据库·sql
那就学有所成吧(˵¯͒¯͒˵)6 小时前
大数据项目(一):Hadoop 云网盘管理系统开发实践
大数据·hadoop·分布式
司沐_Simuoss9 小时前
Text to SQL系统的千层套路~
数据库·人工智能·sql·语言模型·系统架构
ActionTech12 小时前
MySQL 用好 Optimizer Trace,深刻理解 SQL 优化过程!
sql·mysql·oracle
Mr_Xuhhh12 小时前
MySQL索引深度解析:从原理到实践
数据库·sql·mysql
多多*13 小时前
Mysql数据库相关 事务 MVCC与锁的爱恨情仇 锁的层次架构 InnoDB锁分析
java·数据库·windows·sql·oracle·面试·哈希算法
BYSJMG14 小时前
计算机毕业设计选题推荐:基于Hadoop的城市交通数据可视化系统
大数据·vue.js·hadoop·分布式·后端·信息可视化·课程设计
何以不说话15 小时前
堡垒机jumpserver
运维·sql
远方160915 小时前
112-Oracle database 26ai下载和安装环境准备
大数据·数据库·sql·oracle·database
白帽子凯哥哥16 小时前
网络安全Web基础完全指南:从小白到入门安全测试
前端·sql·web安全·信息安全·渗透测试·漏洞