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;
相关推荐
废喵喵呜21 分钟前
达梦数据库权限体系详解:系统权限与对象权限
数据库·sql·oracle
没有羊的王K1 小时前
SQL语言学习(group by,having)
数据库·sql·学习
鸿乃江边鸟1 小时前
Starrocks ShortCircuit短路径的调度
大数据·starrocks·sql
Jay Kay2 小时前
hive新增列之后插入新数据时,新列为NULL的解决办法
数据仓库·hive·hadoop
爱喝水的鱼丶7 小时前
SAP-ABAP:ABAP Open SQL 深度解析:核心特性、性能优化与实践指南
运维·开发语言·数据库·sql·性能优化·sap·abap
Zhang.jialei14 小时前
HiveMQ 2024.9 设计与开发文档
hive·物联网·activemq
DeveloperMrMeng15 小时前
ABAP SQL更新DB小技巧 WITH INDICATORS
sql·sap·abap
小白不想白a18 小时前
【MySQL安全】什么是SQL注入,怎么避免这种攻击:前端防护、后端orm框架、数据库白名单
数据库·sql·mysql·安全
rit843249921 小时前
Web学习:SQL注入之联合查询注入
前端·sql·学习