详解力扣高频SQL50题之180. 连续出现的数字【困难】

传送门:180. 连续出现的数字

题目

表:Logs

±------------±--------+
| Column Name | Type |
±------------±--------+
| id | int |
| num | varchar |
±------------±--------+
在 SQL 中,id 是该表的主键。
id 是一个自增列。

找出所有至少连续出现三次的数字。

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

结果格式如下面的例子所示:

示例 1:

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

方法一:row_number()

解析

官方题解是死代码,只能应对连续三次,他们自己都不知道最佳解法,所以本人认为这题可以定级为困难。
判断元素连续出现次数其实有个经典的公式:全局行号-它的分组排序行号(分组排名),每组中差值相同个数即其连续出现次数,而分组,排序并赋予排名是row_number()的特性,而全局行号数组是有序数组,为方便,这里默认全局行号和row_number()都是按递增排序的,所以全局行号即表中的id,分组排名即row_number()后的值,全局行号-分组排名中相同数字个数即对应的数字连续出现个数,结果如下表所示:

id分组字段numid分组排名id - id分组排名
1110
2120
3130
4213
5141
6224
7234

有了这个表格后,计算过程就很明显了,先求出id-row_number()按num分组的排名,别名rn,再嵌套一层查询求组内相同rn的个数>=3的记录,组内相同rn的数量,即按num和rn分组后的组内数量,所以要按num和rn分组,再筛选组内数量>=3的记录,坑点来了:按num和rn分组不意味着num是唯一的,只有按num分组才能保证num唯一,所以必须对num去重后再返回num。

代码(标准SQL)

select distinct num as ConsecutiveNums
from(select num,
id-row_number()over(partition by num order by id) as rn
from Logs)
group by num,rn
having count(*)>=3;

方法二:lead()

解析

学过开窗函数的都知道,lead()是把当前行的后面几行往上拉,lag()则相反,这题用lag()或lead()都行,本人习惯用lead(),所以这里仅介绍lead()解法。lead()解法和row_number()解法类似,也是求差值,但更简单,因为原理是:若全局行号-它的分组后n行号=-n,则分组字段至少出现n+1次。和上个方法一样,全局行号数组必须是有序数组,即id,id后2行用lead(id,2)实现,需要升序排序,结果如下表所示:

id分组字段numid分组后2行id-id分组后2行
113-2
215-3
31nullnull
427-3
51nullnull
62nullnull
72nullnull

有了这个表格后,计算过程就很明显了,先对id求lead(),按num分组,按id升序,再减去id,别名rn,再嵌套一层查询,求组内rn=2的记录,即出现3次的num,但它不止一个,所以仍要对num去重后再返回num。

代码(标准SQL)

select distinct num as ConsecutiveNums
from(select num,
id-lead(id,2)over(partition by num order by id) as rn
from Logs)
where rn=-2;

总结下两个方法:
假设存在一个有序的全局行号数组和一个分组字段,求至少连续出现n次的分组字段,有两种方法:
1.全局行号-它的分组排名,每组中差值相同个数即分组字段连续出现次数,其中分组排名用row_number()实现,需要排序。
2.若全局行号-它的分组后n行号=-n,则分组字段至少出现n+1次,其中分组后n行号用lead(全局行号,n)实现,需要排序。
注意:全局行号还包括日期

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/90703.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/90703.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

VSCode 报错 Error: listen EACCES: permission denied 0.0.0.0:2288

使用 npm run dev 启动项目时报错:error when starting dev server: Error: listen EACCES: permission denied 0.0.0.0:2288at Server.setupListenHandle [as _listen2] (node:net:1881:21)at listenInCluster (node:net:1946:12)at Server.listen (node:net:2044:…

[2025CVPR-图象超分辨方向]DORNet:面向退化的正则化网络,用于盲深度超分辨率

1. ​问题背景与挑战​ 盲深度超分辨率(Blind Depth Super-Resolution, DSR)的目标是从低分辨率(LR)深度图中恢复高分辨率(HR)深度图,但现有方法在真实场景下面临显著挑战: ​已知…

关系与逻辑运算 —— 寄存器操作的 “入门钥匙”

前言 哈喽大家好,这里是 Hello_Embed 的新一篇学习笔记。在前文中,我们学习了如何用结构体指针操作硬件寄存器,而寄存器的配置往往离不开位运算和条件判断 —— 比如通过逻辑运算精准修改某几位的值,通过关系运算判断硬件状态。这…

使用 Python 将 CSV 文件转换为带格式的 Excel 文件

在日常的数据处理和报表生成工作中,CSV 格式因其简洁性而被广泛采用。但在展示数据时,CSV 文件往往缺乏格式和结构化样式,不利于阅读与分析。相比之下,Excel 格式(如 .xlsx)不仅支持丰富的样式设置&#xf…

每天读本书-《如何度过每天的24小时》

全景式书籍探索框架 1. “这本书是关于什么的?”——核心定位 一句话核心思想:这本书的核心并非教你如何高效地工作,而是倡导你将工作之外的“自由时间”视为一个“内在的另一天”,并投入智力与热情去经营它,从而获得精…

前端开发 React 状态优化

为了更深入地理解 React 状态管理的性能问题及其解决方案,本文将详细分析 React Context 和 State 的性能问题,配以示例代码说明优化策略。之后,讨论 Redux 作为不可变库的性能问题,并引出 Immer 作为优化解决方案。1. React Stat…

剑指offer第2版:双指针+排序+分治+滑动窗口

一、p129-JZ21使奇数位于偶数前面(不考虑相对位置)(hoare快排双指针) 调整数组顺序使奇数位于偶数前面(二)_牛客题霸_牛客网 如果不考虑相对位置的话,那么我们可以模仿hoare快排,使用双指针的思想&#xf…

14-C语言:第14天笔记

C语言:第14天笔记 内容提要 指针 变量指针与指针变量 指针变量做函数参数指针变量指向数组元素 数组指针与指针数组 数组指针回顾 变量指针与指针变量 变量指针:变量的地址值(首地址),本质是指针、地址 指针变量&#…

【笔记】活度系数推导

文章目录一、理想溶液的假设与局限性1.1 理想溶液的定义1.2 理想溶液的局限性二、活度与活度系数的引入2.1 活度的定义2.2 修正后的化学势表达式三、活度系数的物理意义四、为什么需要活度系数?4.1 理论需求4.2 扩散理论中的必要性五、活度系数的具体作用5.1 在化学…

基于Docker的GPU版本飞桨PaddleOCR部署深度指南(国内镜像)2025年7月底测试好用:从理论到实践的完整技术方案

还是网上没找到这个基于Docker的GPU版本飞桨PaddleOCR部署教程,于是就有了这一篇。 这个的确坑很多,可能后面变一个版本就不好用了,也是为什么这篇博客不完全粘贴代码的原因。 端口是示例,可以随意改。在人工智能与文档数字化高速…

Python-初学openCV——图像预处理(三)

目录 一、边缘填充 1、边界复制 2、边界反射 3、边界反射101 4、边界常数 5、边界包裹 二、透视变换 三、图像掩膜 1、制作掩膜 2、与运算 3、颜色替换 四、ROI切割 五、图像添加水印 一、边缘填充 我们对图像进行处理后,需要对空出来的区域进行一个填充…

【ESP32设备通信】-W5500与ESP32 /ESP32 S3集成

W5500与ESP32 /ESP32 S3集成 文章目录 W5500与ESP32 /ESP32 S3集成 1、W5500介绍 2、硬件准备与接线 3、代码实现 3.1 以太网设置 3.2 简单HTTP请求 3.3 HTTPS请求 3.4 查询证书 ESP32 凭借其强大的 Wi-Fi 功能,一直是物联网项目的热门选择。ESP32 现在支持带有 SSL 的原生以太…

vue - 使用canvas绘制验证码

封装绘制验证码 verify-code.vue<template><div class"captcha"><canvas ref"canvasRef" :width"width" :height"height" click"refreshCaptcha"></canvas></div> </template><scri…

[10月考试] F

[10月考试] F 题目描述 给定长度为 nnn 的序列 ana_nan​&#xff0c;保证 aia_iai​ 为非负整数。 mmm 次询问&#xff0c;每次给定区间 l,rl,rl,r&#xff0c;求出 al,al1,…,ara_l,a_{l1},\ldots,a_ral​,al1​,…,ar​ 的 mexmexmex。 对于一个序列&#xff0c;定义其 mexm…

收集了全球55个AI写作工具

我们即将推出一整套AI生产力工具矩阵&#xff0c;覆盖内容创作&#xff08;AI写作助手&#xff09;、视觉设计&#xff08;智能图像处理&#xff09;、音视频制作&#xff08;自动转录与编辑&#xff09;及智能编程等多个核心领域。这些解决方案通过先进的机器学习算法&#xf…

Elastic 劳动力的生成式 AI:ElasticGPT 的幕后解析

作者&#xff1a;来自 Elastic Jay Shah, Adhish Thite ElasticGPT — 由 Elastic 提供支持&#xff0c;专为 Elastic 打造 ElasticGPT 是我们基于检索增强生成&#xff08;RAG&#xff09;框架构建的内部生成式 AI &#xff08;GenAI&#xff09;助手。它是使用 Elastic 自有…

CS231n-2017 Assignment1

KNN&#xff1a;这里要求我们完成一个KNN分类器&#xff0c;实现对图片使用KNN算法进行分类标签k_nearest_neighbor.py这里要求我们完成4个接口# X:测试集 # 使用两个循环 def compute_distances_two_loops(self, X):num_test X.shape[0]num_train self.X_train.shape[0]dist…

[python][flask]Flask-Principal 使用详解

Flask-Principal 是一个专为 Flask 应用设计的身份管理和权限控制扩展。它能够帮助开发者轻松实现用户身份验证和权限管理&#xff0c;从而提升应用的安全性和用户体验。该项目最初由 Ali Afshar 开发&#xff0c;现已成为 Pallets 社区生态系统的一部分&#xff0c;由社区共同…

抖音与B站爬虫实战,获取核心数据

本文将深入讲解两大主流短视频平台&#xff08;抖音、B站&#xff09;的爬虫实战技术&#xff0c;提供可直接运行的代码解决方案&#xff0c;并分享突破反爬机制的核心技巧。一、平台特性与爬虫难点对比平台数据价值主要反爬措施推荐抓取方式抖音视频数据、用户画像、热榜签名验…

WSL切换网络模式

WSL切换网络模式问题WSL从NAT改成MIRRORED找到WSL Setting修改配置重启电脑&#xff08;注意不是重启WSL&#xff09;运行pio run验证IP问题 从鱼香ROS买了一个小鱼车&#xff0c;开始学习&#xff0c;然而装环境都要搞死我了。 垃圾VirtualBox我新买的电脑&#xff0c;装个Vi…