SQL實戰:02之連續數問題求解

文章目錄

  • 概述
  • 題目:體育館的人流量
  • 題解
    • 步驟一:構造出一個連續序列
    • 步驟二:找出符合條件的組的序號
    • 步驟三:fetch結果,使用內連接過濾出符合條件的記錄。
    • 完整SQL
  • 題目二:連續出現的數字
  • 題解
    • 步驟一:分區并構建連續的序列
    • 步驟二:使用id減去連續序列
    • 步驟三:分組統計得出次數
    • 完整SQL
    • 其他解法

概述

最近刷題時遇到了一些有意思的題,查詢連續出現多次的數或者最長的連續序列,而且出現了多次,對于這種題的實現思想就是利用等差數列的思想來解決。

一個連續的序列減一個連續的序列的差值一定是相同的。

例如有一個整數序列A:[4,5,6,7,8,10,11,12,15,19] 可以看到其中有些數據是連續的,有些不是連續的。為了找出這些 連續的序列可以按照從小到大給這組數排序,得到一個排名序列B,如下: 
[1,2,3,4,5,6,7,8,9,10]利用序列A - 序列B得到的答案是[3,3,3,3,3,4,4,4,6,9]可以很明顯的看出只要是連續的值得到的差值都是相同的。

利用這個思想,就可以很方便的解決這類問題。

題目:體育館的人流量

表:Stadium
+---------------+---------+
| Column Name   | Type    |
+---------------+---------+
| id            | int     |
| visit_date    | date    |
| people        | int     |
+---------------+---------+
visit_date 是該表中具有唯一值的列。
每日人流量信息被記錄在這三列信息中:序號 (id)、日期 (visit_date)、 人流量 (people)
每天只有一行記錄,日期隨著 id 的增加而增加編寫解決方案找出每行的人數大于或等于 100 且 id 連續的三行或更多行記錄。返回按 visit_date 升序排列 的結果表。查詢結果格式如下所示。示例 1:輸入:
Stadium 表:
+------+------------+-----------+
| id   | visit_date | people    |
+------+------------+-----------+
| 1    | 2017-01-01 | 10        |
| 2    | 2017-01-02 | 109       |
| 3    | 2017-01-03 | 150       |
| 4    | 2017-01-04 | 99        |
| 5    | 2017-01-05 | 145       |
| 6    | 2017-01-06 | 1455      |
| 7    | 2017-01-07 | 199       |
| 8    | 2017-01-09 | 188       |
+------+------------+-----------+
輸出:
+------+------------+-----------+
| id   | visit_date | people    |
+------+------------+-----------+
| 5    | 2017-01-05 | 145       |
| 6    | 2017-01-06 | 1455      |
| 7    | 2017-01-07 | 199       |
| 8    | 2017-01-09 | 188       |
+------+------------+-----------+
解釋:
id 為 5、6、7、8 的四行 id 連續,并且每行都有 >= 100 的人數記錄。
請注意,即使第 7 行和第 8 行的 visit_date 不是連續的,輸出也應當包含第 8 行,因為我們只需要考慮 id 連續的記錄。
不輸出 id 為 2 和 3 的行,因為至少需要三條 id 連續的記錄。

題解

因為要求解id連續的三行或者更多行的記錄,且每行人數大于或等于100,這個就是典型的 求解 連續序列的問題。對于這類問題的核心思想就是利用等差數列來求解,一個連續遞增的序列減另一個連續遞增的序列,得到的差值是相同的。

步驟一:構造出一個連續序列

利用row_number() 函數,按照id的升序排列構造出一個連續的序列(1,2,3,4,5等等)并且過濾出人數大于等于100的行。再使用id減去row_number,會得到一個值

with grouped_table AS(SELECT id,id - row_number() over(order by id ASC) AS groupID,visit_date,peopleFROM Stadium where people >= 100
)

步驟二:找出符合條件的組的序號

第一步ID減去row_number后,如果id是連續的,那么得到的差值group_id一定是相等的,所以可以通過groupID來做分組查詢,統計出連續序列的長度,并過濾出連續的三行或者更多行的groupID。

hinted_group_table As(SELECT  groupID from grouped_table group by groupID having count(*) >= 3
)

步驟三:fetch結果,使用內連接過濾出符合條件的記錄。

SELECT id,visit_date,people FROM grouped_table T1,hinted_group_table T2 where T1.groupID = T2.groupID;

完整SQL

with grouped_table AS(SELECT id,id - row_number() over(order by id ASC) AS groupID,visit_date,peopleFROM Stadium where people >= 100
),hinted_group_table As(SELECT  groupID from grouped_table group by groupID having count(*) >= 3
)
SELECT id,visit_date,people FROM grouped_table T1,hinted_group_table T2 where T1.groupID = T2.groupID;

題目二:連續出現的數字

表: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 是唯一連續出現至少三次的數字。

題解

步驟一:分區并構建連續的序列

按照num分區,并按照id排序,將相同數字劃分到統一窗口中,生成一個連續的排序序號。

with t1 AS (SELECT id, num, row_number() over(partition by num order by id) AS rn from  Logsorder by num asc,id asc
),

輸出

| id | num | rn |
| -- | --- | -- |
| 1  | 1   | 1  |
| 2  | 1   | 2  |
| 3  | 1   | 3  |
| 5  | 1   | 4  |
| 4  | 2   | 1  |
| 6  | 2   | 2  |
| 7  | 2   | 3  |

步驟二:使用id減去連續序列

select id,num,id-rn AS rn from t1

輸出

| id | num | rn |
| -- | --- | -- |
| 1  | 1   | 0  |
| 2  | 1   | 0  |
| 3  | 1   | 0  |
| 5  | 1   | 1  |
| 4  | 2   | 3  |
| 6  | 2   | 4  |
| 7  | 2   | 4  |

從上面的數據既可以看到數字1:連續出現的數字1的id減去連續的排名序列時的值都為0.

步驟三:分組統計得出次數

利用差值和num分組統計出現次數就可以得出連續出現的數字

select distinct num AS ConsecutiveNums from t1 group by num,rn having count(*) >= 3;

輸出

| ConsecutiveNums |
| --------------- |
| 1               |

完整SQL

with t1 AS (SELECT id, num, row_number() over(partition by num order by id) AS rn from  Logsorder by num asc,id asc
),
t2 AS (select id,num,id-rn AS rn from t1
)select distinct num AS ConsecutiveNums from t2 group by num,rn having count(*) >= 3;

其他解法

這道題還有其他解法,因為只需要統計出 連續出現至少3次的數字,所以可以通過下移來解決,如下所示:

with  t1 AS (select id,num,lag(num,1) over(order by id) as prev_num from Logs
),
t2 as (select id,num,prev_num,lag(prev_num,1) over(order by id) as prev_num2 from t1
)
select distinct num as ConsecutiveNums from t2 where num-prev_num=0 and num-prev_num2=0;

當然這種方式 有一個局限性,僅僅適用于連續出現次數比較少的場景,需要下移n-1次。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/80350.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/80350.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/80350.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

STM32 的 GPIO和中斷

GPIO的簡單介紹 內部結構 施密特觸發器(TTL肖特基觸發器) 的工作原理: 施密特觸發電路(簡稱)是一種波形整形電路,當任何波形的信號進入電路時,輸出在正、負飽和之間跳動,產生方波或…

Server - 優雅的配置服務器 Bash 環境(.bashrc)

歡迎關注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://spike.blog.csdn.net/article/details/147335592 免責聲明:本文來源于個人知識與公開資料,僅用于學術交流,歡迎討論,不支持轉載。 登錄服…

使用PyTorch實現圖像增廣與模型訓練實戰

本文通過完整代碼示例演示如何利用PyTorch和torchvision實現常用圖像增廣方法,并在CIFAR-10數據集上訓練ResNet-18模型。我們將從基礎圖像變換到復雜數據增強策略逐步講解,最終實現一個完整的訓練流程。 一、圖像增廣基礎操作 1.1 準備工作 #matplotli…

解決Mac 安裝 PyICU 依賴失敗

失敗日志: 解決辦法 1、使用 homebrew 安裝相關依賴 brew install icu4c 安裝完成后,設置環境變量 echo export PATH"/opt/homebrew/opt/icu4c77/bin:$PATH" >> ~/.zshrcecho export PATH"/opt/homebrew/opt/icu4c77/sbin:$PATH…

Springboot后端查詢參數接收

1.實現方式 假設前端發送的接口: /users?nameJohn&age30 后端怎么接收里面的name和age呢?以及再發別的參數后端怎么接收呢? 1.比較簡單的方式 當控制器方法的參數類型是簡單類型(如 String、Integer、Long 等&#xff09…

桌面應用中VUE使用新瀏覽器窗口打開頁面

1、瀏覽器應用忽略此方式,可任意方式打開。針對桌面應用設置 newWindowClick(){try {this.fileUrl "";this.params.year ""this.params.date ""axios({method: post,url: /url/pdf/preview,data: this.params,}).then(res> {t…

華為手機怎么進行音頻降噪?音頻降噪技巧分享:提升聽覺體驗

在當今數字化時代,音頻質量對于提升用戶體驗至關重要,無論是在通話、視頻錄制還是音頻文件播放中,清晰的音頻都能帶來更佳的聽覺享受。 而華為手機憑借其強大的音頻處理技術,為用戶提供了多種音頻降噪功能,幫助用戶在…

【數據可視化-22】脫發因素探索的可視化分析

?? 博主簡介:曾任某智慧城市類企業算法總監,目前在美國市場的物流公司從事高級算法工程師一職,深耕人工智能領域,精通python數據挖掘、可視化、機器學習等,發表過AI相關的專利并多次在AI類比賽中獲獎。CSDN人工智能領域的優質創作者,提供AI相關的技術咨詢、項目開發和個…

青少年編程與數學 02-018 C++數據結構與算法 06課題、樹

青少年編程與數學 02-018 C數據結構與算法 06課題、樹 一、樹(Tree)1. 樹的定義2. 樹的基本術語3. 常見的樹類型4. 樹的主要操作5. 樹的應用 二、二叉樹(Binary Tree)1. 二叉樹的定義2. 二叉樹的基本術語3. 二叉樹的常見類型4. 二叉樹的主要操作5. 二叉樹的實現代碼說明輸出示例…

【論文閱讀】Visual Instruction Tuning

文章目錄 導言1、論文簡介2、論文主要方法3、論文針對的問題4、論文創新點總結 導言 本論文介紹了一個新興的多模態模型——LLaVA(Large Language and Vision Assistant),旨在通過指令調優提升大型語言模型(LLM)在視覺…

【學習筆記】Cadence電子設計全流程(三)Capture CIS 原理圖繪制(下)

【學習筆記】Cadence電子設計全流程(三)Capture CIS 原理圖繪制(下) 3.16 原理圖中元件的編輯與更新3.17 原理圖元件跳轉與查找3.18 原理圖常見錯誤設置于編譯檢查3.19 低版本原理圖文件輸出3.20 原理圖文件的鎖定與解鎖3.21 Orca…

js使用IntersectionObserver實現目標元素可見度的交互

文章目錄 1、前言2、代碼實現3、使用場景4、兼容性5、成熟的Hooks推薦 1、前言 IntersectionObserver 是瀏覽器原生提供的一個Api。可以"觀察"我們的元素是否可見,原理是判斷目標元素與可見區域的交叉比例,所以也被稱為"交叉觀察器"…

linux 中斷子系統 層級中斷編程

虛擬中斷控制器代碼&#xff1a; #include<linux/kernel.h> #include<linux/module.h> #include<linux/clk.h> #include<linux/err.h> #include<linux/init.h> #include<linux/interrupt.h> #include<linux/io.h> #include<linu…

蝦皮(Shopee)商品詳情 API 接口概述及 JSON 數據返回參考

前言 一、接口概述 Shopee 商品詳情 API 接口是 Shopee 平臺為開發者提供的&#xff0c;用于獲取商品詳細信息的接口服務。通過該接口&#xff0c;開發者可以獲取商品的標題、價格、庫存、描述、圖片、規格參數、銷量、評價等詳細信息。這些數據為電商數據分析、商品比價工具…

three.js中的instancedMesh類優化渲染多個同網格材質的模型

three.js小白的學習之路。 在上上一篇博客中&#xff0c;簡單驗證了一下three.js中的網格共享。寫的時候就有一些想法&#xff0c;如果說某個場景中有一萬棵樹&#xff0c;這些樹共享一個geometry和material&#xff0c;有沒有好的辦法將其進行一定程度上的渲染優化&#xff0…

MySQL-自定義函數

自定義函數 函數的作用 mysql數據庫中已經提供了內置的函數&#xff0c;比如&#xff1a;sum&#xff0c;avg&#xff0c;concat等等&#xff0c;方便我們日常的使用&#xff0c;當需要時mysql支持定義自定義的函數&#xff0c;方便與我們對于需用復用的功能進行封裝。 基本…

ESP32上C語言實現JSON對象的創建和解析

在ESP32上使用C語言實現JSON對象的創建和解析&#xff0c;同樣可以借助cJSON庫。ESP-IDF&#xff08;Espressif IoT Development Framework&#xff09;本身已經集成了cJSON庫&#xff0c;你可以直接使用。以下是詳細的步驟和示例代碼。 1. 創建一個新的ESP-IDF項目 首先&…

【FAQ】PCoIP 會話后物理工作站本地顯示器黑屏

# 問題 工作人員從家里建立了到辦公室工作站的 PCoIP 連接&#xff0c;該工作站安裝了 HP Anyware Graphics Agent&#xff0c;并且還連接了本地顯示器。然后&#xff0c;遠程用戶決定去辦公室進行本地工作&#xff0c;工作站顯示器顯示黑屏&#xff08;有時沒有信號&#xff…

el-table 目錄樹列表本地實現模糊查詢

table目錄樹結構實現模糊查詢 <el-form :model"queryParams" ref"queryForm" size"small" :inline"true" v-show"showSearch"><el-form-item label"名稱:" prop"Name"><el-input v-mode…

力扣hot100 LeetCode 熱題 100 Java 哈希篇

兩數之和 1. 兩數之和 - 力扣&#xff08;LeetCode&#xff09; 直接暴力 class Solution {public int[] twoSum(int[] nums, int target) {for(int i0;i<nums.length;i){for(int ji1;j<nums.length;j){long ans nums[i]nums[j];if(ans>target)continue;if(anstarg…