詳解力扣高頻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
英文地址,請注明出處:http://en.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…