Hsql每日一题 | day01

前言

就一直向前走吧,沿途的花终将绽放~

题目:找出连续活跃3天及以上的用户

sql 复制代码
create table t_useractive(
    uid   string,
    dt    string
);

insert into t_useractive
values('A','2023-10-01'),('A','2023-10-02'),('A','2023-10-03'),('A','2023-10-04'),
      ('B','2023-10-01'),('B','2023-10-03'),('B','2023-10-04'),('B','2023-10-05'),
      ('C','2023-10-01'),('C','2023-10-03'),('C','2023-10-05'),('C','2023-10-06'),
      ('D','2023-10-02'),('D','2023-10-03'),('D','2023-10-05'),('D','2023-10-06');

hsql:

sql 复制代码
select uid
from (
select  uid
from
    (select uid,dt,row_number() over (partition by uid order by dt)  rn,
             date_sub(dt, row_number() over (partition by uid order by dt)) c1
      from t_useractive
) t1 group by uid,c1
having count(*) >= 3
)
t2 group by uid;

hsql分析:

  1. 子查询 t1:

    • t_useractive表中选择uiddt
    • 使用row_number() over (partition by uid order by dt)为每个用户的活动记录分配一个行号(按照日期排序)。这个行号被命名为rn
    • 接下来,计算一个名为c1的字段,该字段是日期dt减去行号rn的结果。这样做的目的是为了标记连续的日期,因为对于连续的日期,date_sub(dt, rn)的结果将是相同的。
  2. 子查询 t1 的分组:

    • 使用group by uid, c1对子查询t1的结果进行分组。由于c1字段对于连续的日期是相同的,因此这将把连续的日期记录分组在一起。
  3. having count(*) >= 3:

    • 筛选出那些组中记录数大于或等于3的组,这意味着这些组代表了连续3天或更多的活动。
  4. 外部查询 t2:

    • 由于内部查询已经筛选出了连续3天或更多的活动组,外部查询只需简单地按uid进行分组,并选择uid字段。这一步是为了确保每个用户只被列出一次,即使他们在不同的时间段内有多个连续的3天或更多天的活动。

最终,这个查询将返回所有在t_useractive表中至少有连续3天活动的用户的uid

相关推荐
NineData15 小时前
SQL 都在等锁时,ChatDBA 先帮 MySQL 找到谁在挡路
数据库·人工智能·sql·mysql·安全·数据复制·数据迁移工具
凡人叶枫15 小时前
Effective C++ 条款10:令 operator= 返回一个 reference to *this
java·linux·服务器·开发语言·c++·effective c++
|_⊙16 小时前
Linux 中断
linux
元Y亨H16 小时前
大数据转大模型(LLM)进阶学习路线图
大数据·llm
鸿乃江边鸟16 小时前
Spark中怎么做Spark canonicalize归一化
大数据·分布式·spark
未来之窗软件服务16 小时前
精选之变,顺势而生(2026 年高考语文作文)
大数据·人工智能·高考·仙盟创梦ide·东方仙盟
Gauss松鼠会16 小时前
【GaussDB】GaussDB SMP特性调优详解
java·服务器·前端·数据库·sql·算法·gaussdb
仰望星空的代码16 小时前
科技是市场的唯一
大数据·人工智能·科技·财经·股市行情
芯盾时代16 小时前
企业建立安全防线治理失控的Agent
大数据·人工智能·安全
二等饼干~za89866816 小时前
2026 主流 GEO 源码厂商实测:云罗 GEO、摘星智能、棋引科技技术与落地能力对比
大数据·运维·科技