色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

你知道如何去求解連續區間嗎?

數據分析與開發 ? 來源:大數據技術團隊 ? 作者:Lotus ? 2021-06-21 17:42 ? 次閱讀

求解連續區間是數據分析、數據倉庫筆試面試中常考的SQL題目,今天為各位小伙伴分享筆試面試題,期待各位拿到心儀的offer或有所收獲!

1、連續出現的數字

編寫一個 SQL 查詢,查找所有至少連續出現三次的數字。

+----+-----+| Id | Num |+----+-----+| 1 | 1 || 2 | 1 || 3 | 1 || 4 | 2 || 5 | 1 || 6 | 2 || 7 | 2 |+----+-----+例如,給定上面的Logs表,1是唯一連續出現至少三次的數字。

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

解法一:自連接三次,篩選l1,l2,l3的id連續且Num相等的行

注:如果數字連續出現超過三次,Num就會出現重復值,所以需要使用distinct去重

該方法實現簡單,但是時間復雜度較大,且如果改成連續出現4,5..10次,代碼就會非常冗余,不具備可拓展性。

select distinct l1.Num as ConsecutiveNumsfrom Logs l1,Logs l2,Logs l3where l2.Id = l1.Id + 1and l3.Id = l2.Id + 1and l1.Num = l2.Numand l2.Num = l3.Num

解法二:使用自定義變量進行條件判斷

速度比解法一快,且適用于任一連續次數

select distinct Num ConsecutiveNumsfrom( select Num, case when @prev = Num then @count := @count+1 --如果與之前相等則+1 else (@prev := Num) and (@count := 1) --如果不相等 重新賦值,count變1 end CNT from Logs,(select @prev := 0, @count := 0) t --變量初始化) t where t.CNT>=3

解法三:窗口函數

select distinct Num as ConsecutiveNumsfrom( select Num,Id, lag(Id,2)over(partition by Num order by Id) as prev from Logs)twhere t.Id = t.prev + 2

2、找到連續區間的開始和結束數字

表:Logs

+---------------+---------+| Column Name | Type |+---------------+---------+| log_id | int |+---------------+---------+ id 是上表的主鍵。上表的每一行包含日志表中的一個 ID。后來一些 ID 從 Logs 表中刪除。編寫一個 SQL 查詢得到 Logs 表中的 連續區間的開始數字和結束數字。 將查詢表按照 start_id 排序。查詢結果格式如下面的例子: Logs 表:

+------------+| log_id |+------------+| 1 || 2 || 3 || 7 || 8 || 10 |+------------+結果表:

+------------+--------------+| start_id | end_id |+------------+--------------+| 1 | 3 || 7 | 8 || 10 | 10 |+------------+--------------+結果表應包含 Logs 表中的所有區間。 從 1 到 3 在表中。 從 4 到 6 不在表中。 從 7 到 8 在表中。 9 不在表中。 10 在表中。

解題思路:

(1)使用兩個變量,一個@id用來記錄logid,可以比較當下log_id與之前log_id的差值,判斷是否連續。一個@num用來儲存連續狀態

select log_id, case when @id = log_id - 1 then @num := @num else @num := @num + 1 end num, @id := log_idfrom Logs,(select @num := 0,@id := null)t

上述輸出結果如下所示

輸入:{"headers":{"Logs":["log_id"]},"rows":{"Logs":[[1],[2],[3],[7],[8],[10]]}} 輸出:{"headers": ["log_id", "num", "@prev_id := log_id"], "values": [[1, "1", 1], [2, "1", 2], [3, "1", 3], [7, "2", 7], [8, "2", 8], [10, "3", 10]]}

(2)得到上述結果后,用num字段分組,最小log_id為start_id,最大log_id為end_id。

select min(log_id) start_id, max(log_id) end_idfrom( select log_id, case when @id = log_id - 1 then @num := @num else @num := @num + 1 end num, @id := log_id from Logs,(select @num := 0,@id := null)t)t2group by num

3、報告系統狀態的連續日期

Table: Failed

+--------------+---------+| Column Name | Type |+--------------+---------+| fail_date | date |+--------------+---------+該表主鍵為 fail_date。 該表包含失敗任務的天數. Table: Succeeded

+--------------+---------+| Column Name | Type |+--------------+---------+| success_date | date |+--------------+---------+該表主鍵為 success_date。該表包含成功任務的天數. 系統每天運行一個任務。每個任務都獨立于先前的任務。任務的狀態可以是失敗或是成功。編寫一個 SQL 查詢 2019-01-01 到 2019-12-31 期間任務連續同狀態 period_state 的起止日期(start_date 和 end_date)。即如果任務失敗了,就是失敗狀態的起止日期,如果任務成功了,就是成功狀態的起止日期。 最后結果按照起始日期start_date排序查詢結果樣例如下所示: Failed table:

+-------------------+| fail_date |+-------------------+| 2018-12-28 || 2018-12-29 || 2019-01-04 || 2019-01-05 |+-------------------+Succeeded table:

+-------------------+| success_date |+-------------------+| 2018-12-30 || 2018-12-31 || 2019-01-01 || 2019-01-02 || 2019-01-03 || 2019-01-06 |+-------------------+Result table:

+--------------+--------------+--------------+| period_state | start_date | end_date |+--------------+--------------+--------------+| succeeded | 2019-01-01 | 2019-01-03 || failed | 2019-01-04 | 2019-01-05 || succeeded | 2019-01-06 | 2019-01-06 |+--------------+--------------+--------------+結果忽略了2018年的記錄,因為我們只關心從2019-01-01到2019-12-31的記錄從 2019-01-01 到 2019-01-03 所有任務成功,系統狀態為 "succeeded"。從 2019-01-04 到 2019-01-05 所有任務失敗,系統狀態為 "failed"。從 2019-01-06 到 2019-01-06 所有任務成功,系統狀態為 "succeeded"。

解題思路:核心方法與上題一樣

(1)使用union all合并兩個表結果(相當于比第二題多了個state列)

(2)剩下思路同第二題,但是要維護一個@state狀態,只有當日期連續增加,同時@sate不變的時候才能保持num不變

select period_state, min(task_date) as start_date, max(task_date) as end_datefrom( select period_state,task_date, case when datediff(task_date,@date) = 1 and @state = period_state then @num := @num else @num := @num + 1 end num, @date := task_date, @state := period_state from ( select 'succeeded' as period_state,success_date as task_date from Succeeded where success_date between '2019-01-01' and '2019-12-31' union all select 'failed' as period_state,fail_date as task_date from Failed where fail_date between '2019-01-01' and '2019-12-31' order by task_date ) t1,(select @date := null,@num := 0,@state := null) t2)t3group by period_state,numorder by start_date

4、體育館流量

X 市建了一個新的體育館,每日人流量信息被記錄在這三列信息中:序號 (id)、日期 (visit_date)、 人流量 (people)。

請編寫一個查詢語句,找出人流量的高峰期。高峰期時,至少連續三行記錄中的人流量不少于100。

例如,表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-08 | 188 |+------+------------+-----------+

對于上面的示例數據,輸出為:

+------+------------+-----------+| id | visit_date | people |+------+------------+-----------+| 5 | 2017-01-05 | 145 || 6 | 2017-01-06 | 1455 || 7 | 2017-01-07 | 199 || 8 | 2017-01-08 | 188 |+------+------------+-----------+

提示:每天只有一行記錄,日期隨著 id 的增加而增加。

利用自定義變量求解

1.定義一個變量cnt,如果people >= 100,加1,否則變為0,這樣如果連續三行記錄大于等于100,就會出現連續增加的序列

2.利用id是有序增加的,找出人流量的高峰期

select distinct s.*from stadium s,( select id,visit_date,people, case when people >= 100 then @cnt := @cnt + 1 else @cnt := 0 end as cnt from stadium,(select @cnt:=0)a)bwhere b.cnt >= 3 and s.id between b.id-b.cnt+1 and b.id

責任編輯:lq6

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • SQL
    SQL
    +關注

    關注

    1

    文章

    766

    瀏覽量

    44160
  • 函數
    +關注

    關注

    3

    文章

    4333

    瀏覽量

    62686

原文標題:經典 SQL 筆試面試題:求解連續區間

文章出處:【微信號:DBDevs,微信公眾號:數據分析與開發】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    DAC的高次諧波為什么都會折疊回第一奈奎斯特區間

    如題,在看到的DDS和DAC的資料上都會提到DAC內部的非線性造成的高次諧波會被折疊回第一奈奎斯特區間。不太理解的地方是DAC里并沒有采樣的過程啊?DAC只是一個乘以sin(x)/x和低通濾波
    發表于 12-11 07:05

    單粒子效應置信區間計算

    電子發燒友網站提供《單粒子效應置信區間計算.pdf》資料免費下載
    發表于 09-10 10:31 ?0次下載
    單粒子效應置信<b class='flag-5'>區間</b>計算

    巧了不是,原來也不知道啥是耦電容的“濾波半徑”啊!

    高速先生成員--黃剛 現在稍有經驗的layout工程師都知道在BGA里面不同封裝的耦電容從小到大應該按下圖這樣放置:放置的順序是從小電容到大電容采取從近到遠的方式。 稍微具有SI,PI知識
    發表于 08-19 15:04

    巧了不是,原來也不知道啥是耦電容的“濾波半徑”啊!

    電源設計中的網紅用語:電容耦半徑,大多數人都聽過,但能講出來原理的人估計不多;看完這篇文章,讓你們理論知識和實際設計更上一層樓!
    的頭像 發表于 08-19 14:54 ?414次閱讀
    巧了不是,原來<b class='flag-5'>你</b>也不<b class='flag-5'>知道</b>啥是<b class='flag-5'>去</b>耦電容的“濾波半徑”啊!

    知道影響貼片電感發熱的因素有哪些嗎?

    知道影響貼片電感發熱的因素有哪些嗎?
    的頭像 發表于 08-17 14:24 ?466次閱讀
    <b class='flag-5'>你</b><b class='flag-5'>知道</b>影響貼片電感發熱的因素有哪些嗎?

    知道貼片電感故障時可能出現的癥狀嗎?

    知道貼片電感故障時可能出現的癥狀嗎?
    的頭像 發表于 08-17 14:20 ?388次閱讀
    <b class='flag-5'>你</b><b class='flag-5'>知道</b>貼片電感故障時可能出現的癥狀嗎?

    支路電流法是以什么為求解對象

    支路電流法(Node Voltage Method)是一種用于求解電路中電流分布的方法。它以支路電流為求解對象,通過建立和求解電路方程來確定電路中各個支路的電流。 支路電流法概述 1.1 支路電流法
    的頭像 發表于 08-08 17:00 ?1087次閱讀

    知道共模電感用錯了會有什么影響嗎

    電子發燒友網站提供《知道共模電感用錯了會有什么影響嗎.docx》資料免費下載
    發表于 07-30 10:42 ?0次下載

    關于定位系統技術知道多少?

    定位系統在如今這個沒有隱私的社會,已不是稀奇的技術。 不管是在大街上走還是在商場里逛, 只要想知道的行蹤就被定位系統鎖定了。就像我們看的西部大片,罪犯在這邊打電話,FBI在那邊定位,唧唧幾聲
    的頭像 發表于 07-12 11:16 ?342次閱讀
    關于定位系統技術<b class='flag-5'>你</b><b class='flag-5'>知道</b>多少?

    輥壓機軸承位磨損修復知道的那些事

    電子發燒友網站提供《輥壓機軸承位磨損修復知道的那些事.docx》資料免費下載
    發表于 03-12 15:10 ?0次下載

    知道激光鉆孔技術有多牛嗎?看完這篇文章就明白了

    知道激光鉆孔技術有多牛嗎?看完這篇文章就明白了
    的頭像 發表于 02-29 17:09 ?977次閱讀

    關于CYUSB3014芯片選用連續傳輸模式使用的情況求解

    CYUSB3014芯片選用連續傳輸模式,但由于數據量有限,平時不傳輸數據時候,將CYUSB3014設置為不可用,在傳輸數據時將芯片選擇為可用,在傳輸數據,不知道這么使用是否正常,會不會影響CYUSB3014工作狀態;
    發表于 02-28 07:29

    電容6大特性參數,知道幾個?

    硬件設計好不好,電容參數知多少? 原文整理自書籍《硬件設計指南》 電容是我們電子電路設計中最常用的元件之一,除了基本的電容容值之外,電容還有其他6大參數,知道幾個呢?本文章介紹MLCC陶瓷電容6
    的頭像 發表于 02-21 15:10 ?1128次閱讀
    電容6大特性參數,<b class='flag-5'>你</b><b class='flag-5'>知道</b>幾個?

    TC275的CAN模塊如何配置區間接收?

    當前配置CAN模塊收發都是先會配置好PIN、CANID、MO等等,然后調用收發函數。現在比如我需要接收到外部0x100~0x200區間內任意的一個CAN ID報文,需要怎么配置呢?不可能枚舉把所有都列出來把,如果MO不夠呢
    發表于 02-02 16:48

    BUCK電路的CCM模式占空比,知道哪幾種?

    BUCK電路的CCM模式占空比,知道哪幾種? BUCK電路是一種常見的開關電源拓撲結構,廣泛應用于各種電子設備中。在控制Buck電路開關管的導通時間和關斷時間時,需要根據具體應用需求選擇合適
    的頭像 發表于 02-01 09:08 ?2499次閱讀
    主站蜘蛛池模板: 无码人妻99久久密AV| 成人性生交大片免费看4| 在线看无码的免费网站| 91亚洲精品| 国产99精品视频| 九九热这里都是精品| 欧美亚洲日韩欧洲不卡| 性插图动态图无遮挡| 4480YY旧里番在线播放| 国产大片51精品免费观看| 久久婷婷五月综合色丁香| 涩涩在线视频| 最近2019中文字幕免费| 国产精品18久久久久久白浆.| 久久久无码精品亚洲欧美| 色男人综合| 24小时日本在线电影| 国产老师开裆丝袜喷水漫画| 男人和女人一级黄色大片| 秀婷程仪公欲息肉婷在线观看| 5g天天影院天天看天天爽| 国产欧美精品一区二区色综合 | 黑丝美女娇喘| 欧美性爱 先锋影音| 亚洲午夜精品A片久久软件| 赤兔CHINESE最新男18GUY| 久久久久国产精品嫩草影院| 帅哥操美女| BL文库好大粗黑强强肉NP| 久久 这里只精品 免费| 同居了嫂子在线观看| AV国产乱码一区二区三视频| 九九99国产香蕉视频| 忘忧草研究院一二三| asmr淫语| 久久有码中文字幕| 亚洲成人国产| 大胸美女洗澡扒奶衣挤奶| 蜜桃精品成人影片| 亚洲中久无码永久在线| 国产精品久久毛片A片软件爽爽|