当前位置: 首页 > news >正文

经典sql题(一)求连续登录不少于三天用户

示例数据

假设我们的 test 表有以下数据:

iddate
12023-10-01 08:00:00
12023-10-01 09:00:00
12023-10-02 10:00:00
12023-10-03 11:00:00
22023-10-01 10:00:00
22023-10-02 12:00:00
22023-10-03 14:00:00
22023-10-04 15:00:00
32023-10-01 16:00:00
第一步:去重并提取日期
SELECT id,SUBSTR(date, 1, 10) AS date1
FROM test
GROUP BY id, SUBSTR(date, 1, 10);

结果(表 table1):

iddate1
12023-10-01
12023-10-02
12023-10-03
22023-10-01
22023-10-02
22023-10-03
22023-10-04
32023-10-01
第二步:为每个用户和日期生成序列号
SELECT id,date1,DATE_SUB(date1, INTERVAL ROW_NUMBER() OVER (PARTITION BY id ORDER BY date1) DAY) AS date2
FROM (SELECT id,SUBSTR(date, 1, 10) AS date1FROM testGROUP BY id, SUBSTR(date, 1, 10)
) AS table1;  -- 使用 'table1' 作为别名

结果(表 table2):

iddate1date2
12023-10-012023-10-01
12023-10-022023-10-01
12023-10-032023-10-01
22023-10-012023-10-01
22023-10-022023-10-01
22023-10-032023-10-01
22023-10-042023-10-01
32023-10-012023-10-01
第三步:统计连续的登录天数
SELECT id,date2,COUNT(*) AS day_cnt
FROM (SELECT id,date1,DATE_SUB(date1, INTERVAL ROW_NUMBER() OVER (PARTITION BY id ORDER BY date1) DAY) AS date2FROM (SELECT id,SUBSTR(date, 1, 10) AS date1FROM testGROUP BY id, SUBSTR(date, 1, 10)) AS table1  -- 保持一致,使用 'table1'
) AS table2  -- 使用 'table2' 作为新的别名
GROUP BY id, date2
HAVING COUNT(*) >= 3;

结果(最终结果):

iddate2day_cnt
12023-09-303
22023-09-304

完整步骤解析

  1. 去重提取日期

    • 查询:提取每个用户的唯一登录日期。
    • 结果表 table1:显示每个用户的唯一日期。
  2. 为每个用户生成序列号

    • 查询:为每个用户的日期生成序号,并计算 date2
    • 结果表 table2:显示用户的日期和对应的 date2
  • 步骤
    • 使用 ROW_NUMBER() 函数,按照日期顺序为每个用户的登录日期分配一个序号。

    • 例如,对于用户 ID = 1,假设他们的日期是 2023-10-012023-10-022023-10-03ROW_NUMBER() 将为它们生成序号 1、2 和 3。

    • date2 是通过将每个日期减去它的序号得到的。这个操作的目的是为了检测连续的日期。

    • 例如:

      • 对于 2023-10-01,序号是 1,计算为 2023-10-01 - 1,得到 2023-09-30
      • 对于 2023-10-02,序号是 2,计算为 2023-10-02 - 2,得到 2023-09-30
      • 对于 2023-10-03,序号是 3,计算为 2023-10-03 - 3,得到 2023-09-30

通过这样的计算,我们可以将连续的日期归类到同一个组中。因为给定的 date2 值会相同(如上例中都是 2023-09-30),这使得后续的统计操作(如计算连续登录天数)变得简单。具体来说:

  • 连续性检测:当两个日期的 date2 相同,说明它们是连续的。因此,进行统计时可以通过分组 date2 来确定每个用户连续登录的天数。

以用户 ID = 1 为例:

iddate1ROW_NUMBERdate2
12023-10-0112023-09-30
12023-10-0222023-09-30
12023-10-0332023-09-30
  1. 统计连续的登录天数
    • 查询:根据 date2 统计每个用户的连续登录天数,筛选出连续登录天数大于等于3天的用户。
    • 最终结果:显示符合条件的用户 ID 和连续登录天数。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 通过JNI创建java对象和访问java属性
  • PostgreSQL配置主从同步
  • 从底层原理上理解ClickHouse 中的稀疏索引
  • python解析ip范围,判断ip是否在ip范围内
  • Codeforces Round 889 (Div. 2) B. Longest Divisors Interval
  • Charles mac电脑配置
  • 区块链之变:揭秘Web3对互联网的改变
  • lvs-nat模式实验详解
  • 服务器数据恢复—Linux操作系统环境下网站数据的恢复案例
  • 【电脑组装】✈️从配置拼装到安装系统组装自己的台式电脑
  • Git 中的refs
  • I2C/IIC学习笔记
  • C++ 科目二 [const_cast]
  • AI健身体能测试之基于paddlehub实现引体向上计数个数统计
  • C++——内存管理
  • 【Leetcode】104. 二叉树的最大深度
  • 2018以太坊智能合约编程语言solidity的最佳IDEs
  • CoolViewPager:即刻刷新,自定义边缘效果颜色,双向自动循环,内置垂直切换效果,想要的都在这里...
  • JS 面试题总结
  • node学习系列之简单文件上传
  • passportjs 源码分析
  • PAT A1092
  • Spark VS Hadoop:两大大数据分析系统深度解读
  • uni-app项目数字滚动
  • webpack+react项目初体验——记录我的webpack环境配置
  • 从零开始学习部署
  • 七牛云假注销小指南
  • 事件委托的小应用
  • 无服务器化是企业 IT 架构的未来吗?
  • 鱼骨图 - 如何绘制?
  • MiKTeX could not find the script engine ‘perl.exe‘ which is required to execute ‘latexmk‘.
  • 阿里云移动端播放器高级功能介绍
  • 交换综合实验一
  • ​业务双活的数据切换思路设计(下)
  • #14vue3生成表单并跳转到外部地址的方式
  • #include
  • #我与Java虚拟机的故事#连载13:有这本书就够了
  • (1)(1.11) SiK Radio v2(一)
  • (ibm)Java 语言的 XPath API
  • (PyTorch)TCN和RNN/LSTM/GRU结合实现时间序列预测
  • (附源码)ssm旅游企业财务管理系统 毕业设计 102100
  • (附源码)ssm学生管理系统 毕业设计 141543
  • (函数)颠倒字符串顺序(C语言)
  • (十一)JAVA springboot ssm b2b2c多用户商城系统源码:服务网关Zuul高级篇
  • (使用vite搭建vue3项目(vite + vue3 + vue router + pinia + element plus))
  • (四)Android布局类型(线性布局LinearLayout)
  • (轉貼) 2008 Altera 亞洲創新大賽 台灣學生成果傲視全球 [照片花絮] (SOC) (News)
  • .NET Core 通过 Ef Core 操作 Mysql
  • .Net Core 微服务之Consul(二)-集群搭建
  • .Net Remoting(分离服务程序实现) - Part.3
  • .NET 快速重构概要1
  • .net 中viewstate的原理和使用
  • .net6+aspose.words导出word并转pdf
  • .net程序集学习心得
  • .Net实现SCrypt Hash加密