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

相关推荐
ShineWinsu11 分钟前
对于MySQL:内置函数的解析
linux·数据库·c++·mysql·面试·函数·查询
万物智能信息科技21 分钟前
RK3568 的多路显示移植—【万物智能之开源鸿蒙OpenHarmony系统实战开发系列教程】
linux·开发语言·华为·开源·harmonyos
四季豆3335 分钟前
工业大数据不只是“大”,更是制造业突围的“导航仪”
大数据
IT菜鸟程35 分钟前
Ubuntu 下 apt 版 Nginx 升级为源码编译版本完整操作指南(1.24.0 → 1.30.4 实战)
linux·nginx·ubuntu
新时代牛马41 分钟前
Linux 磁盘管理:分区、文件系统、挂载与扩容
linux·运维·服务器
newsxun1 小时前
光智融合,空间新生|Jupiter SR 亮相光博会CIOE 2026
大数据·人工智能
weixin_402486341 小时前
VS Code Codex/Claude Extension 无法安装 / 无法正常打开
linux·服务器·vscode
大树881 小时前
液冷系统的真正瓶颈,藏在那层不到1毫米的材料里
大数据·运维·服务器·人工智能·ai
奋斗的阿狸_19861 小时前
ch32v003j4m6+ws2812b方案2:规划引脚定义
linux
Vicky_time1 小时前
2026美国海外仓TOP5技术评测:FBA中转海外仓系统对接与操作方案
大数据·系统架构