算法人必懂的進階SQL知識,4道面試常考題

2020-12-17 AI科技大本營

(圖片付費下載自視覺中國)

作者 | 石曉文

來源|小小挖掘機(ID:wAlsjwj)

近期在不同群裡有小夥伴們提出了一些在面試和筆試中遇到的Hive SQL問題,Hive作為算法工程師的一項必備技能,在面試中也是極有可能被問到的,所以有備無患,本文將對這四道題進行詳細的解析,還是有一定難度的,希望你看完本文能夠有所收穫。

1、多列轉多行

第一道題目是這樣的:

假設現有一張Hive表,元數據格式為:欄位:id stirngtim string數據格式如下:a,b,c,d 2:00,3:00,4:00,5:00f,b,c,d 1:10,2:20,3:30,4:40需要變成:a 2:00b 3:00c 4:00d 5:00

這道題目是需要把多行轉換成多行,有點類似python裡面的zip操作。大夥應該都知道hive裡有一個常用的一行轉多行的函數叫explode,假設有如下的數據:

a,b,c,d 2:00,3:00,4:00,5:00f,b,c,d 1:10,2:20,3:30,4:40

按照第二列explode的話,使用下面的SQL:

selectid,tim,single_timfromdefault.a1lateral view explode(split(tim,',')) t as single_tim

效果如下:

但這道題目裡,需要對兩列同時進行explode,如果只進行簡單的explode,效果如下:

這樣一行變成了16行,而我們僅僅需要的是其中能夠對齊下標的四行。所以在進行explode的時候,我們期望不僅僅能夠能夠獲得數組裡的每個值,還希望能夠得到其對應的下標,這樣在對兩列同時進行explode的時候,保留數組下標相同的四行就可以了。這裡我們會用到posexplode函數。

posexplode函數跟explode函數的使用方法類似,看下面的例子:

selectid,tim,single_id_index,single_idfromdefault.a1lateral view posexplode(split(id,',')) t as single_id_index,single_id

返回的結果為:

應用到本題,只需要應用兩次posexplode函數,再通過where留下兩個index相等的行就可以了,按照這個思路,sql如下:

selectid,tim,single_id,single_timfromdefault.a1lateral view posexplode(split(id,',')) t as single_id_index,single_idlateral view posexplode(split(tim,',')) t as single_tim_index,single_timwheresingle_id_index = single_tim_index

結果正是我們想要的:

2、排序後相鄰兩行均值

第二題的原始數據如下:

要求如下:

分組排序想必大家都知道使用row_number函數,但要找到同組前一行的值,可能有許多同學不太了解,這裡是用的是lead/lag函數,兩個函數用法如下:

lag(欄位名,N) over(partition by 分組欄位 order by 排序欄位 排序方式)lead(欄位名,N) over(partition by 分組欄位 order by 排序欄位 排序方式)

lag括號裡理由兩個參數,第一個是欄位名,第二個是數量N,這裡的意思是,取分組排序之後比該條記錄序號小N的對應記錄的指定欄位的值,如果欄位名為ts,N為1,就是取分組排序之後上一條記錄的ts值。

lead括號裡理由兩個參數,第一個是欄位名,第二個是數量N,這裡的意思是,取分組排序之後比該條記錄序號大N的對應記錄的對應欄位的值,如果欄位名為ts,N為1,就是取分組排序之後下一條記錄的ts值。

如果沒有前一行或者後一行,對應的欄位值為。

所以,這裡我們應該使用的是lag函數,來獲取同組排序後前一行數據對應欄位的值,SQL如下:

selectyear,chr,if(pre_val is ,val,(val + pre_val) / 2.0) as avg_valfrom(selectyear,chr,val,lag(val,1) over(partition by year order by chr asc) as pre_valfromdefault.a2) a

注意這裡的一個小細節,如果分組後數據排在第一位,它是沒有前一個數的,此時數仍保持原樣,所以這裡加了一個if判斷,結果符合預期:

3、獲取字符串索引列表

第三題的題目要求如下:

10110101=> 取到每一行中1所對應的索引列表,索引從1開始0101 2,41011 1,3,4

這一行其實也是對posexplode方法的應用,直接上代碼:

selectid,stri,concat_ws(',',collect_list(index)) as indicesfrom(selectid,stri,chr,cast(index + 1 as string) as indexfromdefault.abcglateral view posexplode(split(stri,'')) ids as index,chrwherechr = '1') agroup byid,stri

4、分塊排序

最後一題感覺是比較有難度的一道題目:

2014,12015,12017,02018,02019,12020,12021,12022,02023,0=>2014,1,12015,1,22017,0,12018,0,22019,1,12020,1,22021,1,32022,0,12023,0,2

簡單描述下題目,col1是有序的,然後按照col2分塊計數,每當col2發生變化,就重新開始計數,計數的結果當作col3返回。

這道題我想到的方法可能比較笨,先上代碼,然後咱們一步步解析:

select year,num,row_number over(partition by min_year order by year asc) as new_rankfrom(select year,base.num as num,min_year,row_number over(partition by base.year order by min_year desc) as rankfrom (select *from default.a3) baseinner join (select min_year,num,pre_numfrom (select year as min_year,num,lag(num,1) over(order by year) as pre_numfrom default.a3) awhere num!=pre_numor pre_num is) min_yearon base.num = min_year.numwhere base.year >= min_year.min_year) ccwhere rank = 1order by year

輸出結果符合預期:

接下來,一步步解析下上面的過程:

1)使用lag函數,得到其前面一個數:

select year as min_year,num,lag(num,1) over(order by year) as pre_numfrom default.a3

2)判斷當前數和前面一個數的關係,得到分塊最小值。

如果兩個數不相等,說明在此處數發生了變化,是一個新的分塊的開始,除此之外,如果沒有前一個數,說明當前行是第一行,同樣作為一個分塊的開始。這樣,我們可以得到每個分塊的開始:

select min_year,num,pre_numfrom (select year as min_year,num,lag(num,1) over(order by year) as pre_numfrom default.a3) awhere num!=pre_numor pre_num is

這裡的結果如下:

四個分塊的開始分別是2014、2017、2019、2022。

3)判斷每一行屬於哪個分塊

我們需要拿第二步得到的結果與原結果使用第二列進行join,然後判斷每一行屬於哪個分塊。決定每一行的所屬分塊有兩個條件,首先該行第一列的值要大於或等於分塊的最小值;其次,在所有滿足條件的分塊最小值中,選擇最大的一個,便是該行所在分塊的最小值。

所以這裡我們首先進行join操作,然後使用row_number得到了每一行所在的分塊:

select year,num,min_yearfrom(select year,base.num as num,min_year,row_number over(partition by base.year order by min_year desc) as rankfrom (select *from default.a3) baseinner join (select min_year,num,pre_numfrom (select year as min_year,num,lag(num,1) over(order by year) as pre_numfrom default.a3) awhere num!=pre_numor pre_num is) min_yearon base.num = min_year.numwhere base.year >= min_year.min_year) ccwhere rank = 1order by year

結果如下:

4)把分塊最小值作為分組鍵,進行分組排序

好了,這四道題就解析完畢了,抓緊時間去練習一下吧~~

(*本文為 AI大本營轉載文章,轉載請聯繫原作者。)

相關焦點

  • 手撕SQL | 必知必會5道SQL面試題
    愛數據曉輝 | 作者愛數據學院8月SQL月考題 | 來源附本次sql>表列名含義如下:name:國家名稱continent :該國家屬於哪個洲area:⾯積population:⼈⼝gdp:國內⽣產總值請用sql
  • 大數據分析工程師面試集錦3-SQL/SparkSql/HiveQL
    面試題庫01SQL基礎知識考察對於面試初級數據分析師來說,SQL的面試重點會放在基礎知識的考察,如果最基本的基礎概念和語法都不能熟練回答出來的話,通過面試的機率就會很低。02SQL實操考察SQL基礎知識考察結束後,如果面試者整體表現尚佳,面試官就會加大考題難度,以實際工作中的SQL應用程度來考察大家,具體體現為對多張表之間的檢索考察,相關知識點涉及:表聯結、子查詢、組合查詢。
  • SQL 語句中 where 條件後 寫上 1=1 是什麼意思
    2020-04-01 11:47:21 來源: java進階架構師 舉報
  • 華西都市報獨家揭秘公務員公招面試:4天4考題3道據本報報導(組圖)
    (原標題:華西都市報獨家揭秘公務員公招面試:4天4考題3道據本報報導(組圖))
  • SQL面試常考題有哪些?
    上周六的公開課,我們數據應用學院的老師就為大家介紹了SQL的重要性以及面試的常考題目。為什麼會考核SQL? 其實這很好理解。數據分析都是以數據為基礎的,要想進行分析,首先要把數據從資料庫中提取出來;而SQL又是最常用的資料庫查詢語言,所以,不考才怪‍️。
  • 衡中狀元揭秘:吃透這300道初中數學必考題,中考輕鬆135+
    衡中狀元揭秘:吃透這300道初中數學必考題,中考輕鬆135+!學習數學,重在方法,尤其要善於從典型的常考題中找出規律,總結和反思,從而不斷提高。在初中階段,學習數學,最關鍵的是要從具體的知識開始,然後上升到思想方法的層面,因為數學的本質就是思維。進入初中後,學生面臨著越來越多的學習困難,需要解決的問題也越來越多,更需要從各方面來把握好知識體系。學好是通過現象把握本質的過程,而我們初中生在學數學的時候,最容易陷入書山題海,卻抓不住規律,這是比較可惜的。
  • 衡中狀元揭秘:吃透這300道初中數學必考題,中考輕鬆135+!
    衡中狀元揭秘:吃透這300道初中數學必考題,中考輕鬆135+!學習數學,重在方法,尤其要善於從典型的常考題中找出規律,總結和反思,從而不斷提高。在初中階段,學習數學,最關鍵的是要從具體的知識開始,然後上升到思想方法的層面,因為數學的本質就是思維。進入初中後,學生面臨著越來越多的學習困難,需要解決的問題也越來越多,更需要從各方面來把握好知識體系。學好是通過現象把握本質的過程,而我們初中生在學數學的時候,最容易陷入書山題海,卻抓不住規律,這是比較可惜的。
  • SQL | 數據分析面試必備SQL語句+語法
    我本人曾在滴滴、美團、平安科技的數據分析類崗位實習過,實習期間會大量運用sql進行取數。也參與了2018年的秋招,做過網易、拼多多、新浪等等公司的數據分析筆試題,還是比較了解SQL常考的題目類型的。寫這篇文章是希望幫助還沒有實戰過SQL的小夥伴、或者了解一些SQL語句,但是擔心自己了解的太片面的小夥伴。
  • 初中英語考題規律及趨勢_教師資格面試初中英語
    教師資格初中英語考題規律及趨勢_教師資格面試初中英語,中公講師為大家進行錄製教師資格面試備考系列視頻,希望對各位考生有所幫助。以下為初中英語考題規律及趨勢。初中英語考題規律及趨勢一、考題分析題型分布特點從考題的整體情況和對新課程標準的分析來看,教師資格面試考試中的考查種類主要有六種:聽說課(註:初中的口語課往往是問答式的,有特定的話題和句型,一般也可以設計成聽說,突出口語活動設計即可)、閱讀課、寫作課、詞彙課、語法課以及語音課。針對不同的學段考查的課型側重有所不同,因此在備課的過程中要對最常考查的課型多加練習。
  • 求職面試莫緊張!58個會計面試技巧+筆試考題+財務簡歷模板收好!
    4、行為禮儀:著裝和坐姿,保持微笑 ,千萬不要因為激動東倒西歪!二、進入面試環節:1、自我介紹:這是一道必考題非常關鍵,2-3分鐘的發言是你過往成績和為人處世的總結,也是你接下來面試的基調,所有的話題將圍繞這個展開!
  • 高中英語考題規律及趨勢_教師資格面試高中英語
    教師資格高中英語考題規律及趨勢_教師資格面試高中英語,中公講師為大家進行錄製教師資格面試備考系列視頻,希望對各位考生有所幫助。以下為高中英語考題規律及趨勢。題型分布特點從考題的整體情況和對新課程標準的分析來看,教師資格面試考試中的考查種類主要有六種:聽說課、閱讀課、寫作課、詞彙課、語法課以及語音課。針對不同的學段考查的課型側重有所不同,因此在備課的過程中要對最常考查的課型多加練習。高中最常考查的課型為:閱讀課,但近兩年口語課及語音課考察補助增加,詞彙課以及語法課為考查的次重點。2.
  • sql子查詢面試題
    這是《從零學會sql》系列課程第4節課《複雜查詢》的練習題,也是常考常考的面試題。
  • 如何學習SQL語言
    為了幫助剛畢業找工作,或者想轉行成為數據分析師工作的朋友,我會用下面內容教會你怎樣用最快速、最容易理解的方式學會資料庫和SQL,並使用SQL進行數據分析:1.入門2.簡單查詢3.匯總分析4.複雜查詢5.多表查詢6.求職面試題7.檢驗SQL的學習效果第1部分:入門學習以下內容:1)了解資料庫的基本概念
  • 2019山東教師資格面試:高中數學考題規律及趨勢
    2019山東教師資格面試:高中數學考題規律及趨勢 教資面試時間:2020年1月4日,要參加面試的小夥伴們抓緊時間準備起來吧。為了大家能夠更好的備考教資面試,山東中公教育小編給大家準備了些知識點,希望可以幫助大家,今天給大家帶來:2019山東教師資格面試:高中數學考題規律及趨勢學科專業知識 | 綜合素質 | 綜合知識與能力
  • 2020年8月29日,浙江省公務員面試,招錄村幹部的面試考題
    2020年8月29日,浙江省公務員面試,招錄村幹部的面試考題,考生回憶的三道題,其主要內容是:1、從善如登,從惡如崩。談談你對這句話的理解?2、小李大學辯論能手,到單位後工作很有激情,但是做了調解等工作後經常失敗,導致情緒低落,作為同事,你會怎麼勸說,請現場模擬。3、檢查人員與鄉鎮幹部對話,向鄉鎮幹部了解的扶貧對象情況:有無住房,住在哪裡?
  • 幾道常見的SQL面試題,看你能答對幾道?
    SQL面試題,在不看底部參考答案的情況下,看自己能做對幾道。刪除除了自動編號不同, 其他都相同的學生冗餘信息 3.一個叫 team 的表,裡面只有一個欄位name, 一共有4 條紀錄,分別是a,b,c,d, 對應四個球對,現在四個球對進行比賽,用一條sql  語句顯示所有可能的比賽組合
  • 公務員筆試結束 考題難度下降 3月底面試
    考生們普遍認為,今年考題總體難度低於去年,但題型與題量有所變化。記者了解到,考生的筆試成績在年前便可出來,面試時間大概在今年3月份。     行政職業能力測試:比去年少10題     宋志紅老師已是第八次參加考前公務員培訓工作。宋老師表示,與往年的行政職業能力測試題相比,今年的題量有所減少。去年為135道題,今年為125道,少了10道題。
  • 小學英語考題規律及趨勢_教師資格面試小學英語(視頻)
    小學英語考題規律及趨勢_教師資格面試小學英語(視頻) 來源:中國教師資格網  時間:2019-11-06 19:37:28 --> 小學英語考題規律及趨勢_教師資格面試小學英語
  • 高中日語考題規律及趨勢_教師資格面試高中日語(視頻)
    高中日語考題規律及趨勢_教師資格面試高中日語(視頻) 來源:中國教師資格網  時間:2019-11-06 19:51:52 --> 高中日語考題規律及趨勢_教師資格面試高中日語
  • 做數據sql不熟練?解析50道經典面試題,sql從入門到進階
    明天要面試,十萬火急!!!數據下午出,火燒眉毛了!!!阿狗怎麼辦???