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;
相关推荐
herinspace10 小时前
管家婆实用贴-SQL 2008如何修改成混合模式
服务器·数据库·sql·管家婆软件·财务软件·合肥管家婆软件
大模型最新论文速读12 小时前
text-to-sql:从学术玩具到生产落地
数据库·sql
Decay__13 小时前
15_MySQL 数据同步与迁移方案 —— 复制 / DataX / Canal / 异构同步(对标 Oracle GoldenGate)
运维·数据库·sql·mysql·架构
zjx238814 小时前
oracle11g转Gbase8s库SQL常见问题修改
数据库·sql
杨云龙UP15 小时前
Oracle 同义词(SYNONYM)详解及 Toad for Oracle SQL 智能补全配置实战
运维·数据库·sql·oracle·同义词·toad·toad for oracle
Decay__15 小时前
17_MySQL 监控体系构建 —— mysqld_exporter + Prometheus + Grafana 全栈实战
运维·数据库·sql·mysql·架构
w-w0w-w1 天前
SQL注入
网络·数据库·sql
宇宙无敌暴龙战士6661 天前
MySQL 8 库表操作学习笔记:SQL 基础、库表管理、约束与用户授权全流程
数据库·sql·mysql·学习笔记·后端开发
对空六课1 天前
埋点上报太频繁拖性能,先做批量合并和时机控制
sql·工具选型·数据上报·埋点方案·sdk接入
茶海棠1 天前
Hadoop+zookeeper+HBase+Kafka集群搭建全流程
hadoop·zookeeper·kafka·hbase