【力扣 】查找所有至少连续出现三次的数字/求连续登录3天的用户数(SQL完成)

news/2024/10/18 1:42:37/

0. 题目

编写一个 SQL 查询,查找所有至少连续出现三次的数字。

返回的结果表中的数据可以按 任意顺序 排列。

输入:
Logs 表:
±—±----+
| Id | Num |
±—±----+
| 1 | 1 |
| 2 | 1 |
| 3 | 1 |
| 4 | 2 |
| 5 | 1 |
| 6 | 2 |
| 7 | 2 |
±—±----+
输出:
Result 表:
±----------------+
| ConsecutiveNums |
±----------------+
| 1 |
±----------------+
解释:1 是唯一连续出现至少三次的数字。

1. 关键

核心思想是要想明白这个结论: 如果一个num连续出现时,那么它出现的[真实序列]-它出现的次数一定是个定值。 因为:

  • 假设一个num出现后,它的 真实序列 为 i ,同时假设它是第 k 次出现的; 差值为i-k.
  • 当它连续出现一次时,它的 真实序列 一定为 i+1 ; 它的出现次数显然也会+1,为 k+1 ; 差值为 i+1-(k+1)=i-k.
  • 当它连续出现第 n 次时,它的 真实序列 一定为 i+n;它出现的次数为 k+n;差值为 i+n-(k+n)=i-k.
  • 如果它不连续出现,假设m个其他num出现之后,它又出现了,它的真实序列为i+n+m+1,差值为i-k+m”,所以当m不为0时,差值不为i-k。

官解是直接三表联查

SELECT DISTINCT
l1.Num AS ConsecutiveNums
FROM
Logs l1,
Logs l2,
Logs l3
WHERE
l1.Id = l2.Id - 1
AND l2.Id = l3.Id - 1
AND l1.Num = l2.Num
AND l2.Num = l3.Num
;

官解如果id不连续,根据Id计算会出现bug

2. 窗口函数

连续的关键: 真实序列-分区后出现的次数=定值

SELECT DISTINCT Num FROM (
SELECT Num,COUNT(1) as SerialCount FROM
(SELECT Id,Num,
ROW_NUMBER() over(order by id) -
ROW_NUMBER() over(partition by Num order by Id) as SerialNumberSubGroup
FROM ContinueNumber) as Sub
GROUP BY Num,SerialNumberSubGroup HAVING COUNT(1) >= 3) as Result

https://leetcode.cn/problems/consecutive-numbers/solutions/21537/sql-server-jie-fa-by-neilsons/

3.求连续登录3天的用户数

SELECT user_id
FROM (
SELECT
user_id,
login_date,
row_number() OVER(PARTITION BY user_id ORDER BY login_date) AS rn,
date_sub(login_date, rn) AS flag_date
FROM t_user
) tmp
GROUP BY tmp.user_id, date_sub(login_date, rn) – 每个用户每次连续登录的分块
HAVING COUNT(1) >= 3

注:上述代码仅求出了连续登录3天以上的所有user_id,并非user_id数。

https://www.nowcoder.com/discuss/353148341368332288?sourceSSR=search


http://www.ppmy.cn/news/386819.html

相关文章

空压机设备远程监控解决方案

空压机设备远程监控解决方案 空压机物联网系统,通过物联网技术实现远程监控管理功能,空压机物联网系统将终端空压机的各种数据信息传输到监控中心,便于时时在线监控、记录、查询、统计、分析。空压机物联网,同时客户可使用PC端、…

SRE 的工作介绍

哈喽大家好,我是咸鱼 今天看到了一篇很不错的文章,作者是一名 SRE 工程师,在 Shopee 工作,base 新加坡 分享出来给大家看看 作者:卡瓦邦噶 原文链接:https://www.kawabangga.com/posts/4481 原文如下&…

MAC电脑设置权限

​​​​​​​ click on your background to go to finderclick on go and go to folder /usrright click on local and do get infounlock the lock at the bottomclick sign and add your user to the list and give read/write privilegesclick on the gear sign at the …

抖音seo矩阵号源码开发分享(一)

抖音SEO矩阵系统源码开发,需要遵循一下步骤: 1. 确定需求和功能:明确系统的主要目标和需要实现的功能,包括关键词研究、短视频制作、外链建设、数据分析、账号设置优化等方面。 2. 设计系统架构:根据需求和功能确定系…

HarmonyOS元服务端云一体化开发快速入门(上)

一、前提条件 您已使用已实名认证的华为开发者帐号登录DevEco Studio。 请确保您的华为开发者帐号余额充足,账户欠费将导致云存储服务开通失败。 二、选择云开发模板 1.选择以下任一种方式,打开工程创建向导界面。 如果当前未打开任何工程&#xff0c…

剑指offer25 合并两个有序链表

剑指offer25 合并两个有序链表 文章目录 剑指offer25 合并两个有序链表方法一:递归方法二:迭代 参考文献 方法一:递归 思路:我们可以如下递归地定义两个链表里的merge操作(忽略边界情况,比如空链表等&…

腾讯魔镜壁纸所在位置

C:\Users\lenovo\AppData\Roaming\Tencent\DeskGo 1.打开C盘->用户,设置所有目录可见 2.打开用户文件夹,AppData目录可见 3.Roaming\Tencent\DeskGo目录,即可见壁纸

C语言符合类型之结构篇(结构指针)

结构相关知识总结 什么是结构?结构的声明与简单使用结构的初始化结构中成员变量的访问结构的初始化器结构数组结构数组的声明结构数组的成员标识 结构的嵌套结构指针结构作为参数在函数中传递将结构成员作为参数进行传递将结构地址(指向结构的指针)作为参数进行传递…