日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

【数据分析面试】大厂高频SQL笔试题(一)

發布時間:2023/12/10 数据库 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【数据分析面试】大厂高频SQL笔试题(一) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

01、寫在前面

秋高氣爽,金桂飄香,十月份即將結束,對于求職的小伙伴們來說,“金九銀十”已經接近尾聲,不知道小伙伴們有沒有找到自己心儀的工作呢?相信大多數的小伙伴都經歷過數據分析的面試流程了,在數據分析的面試過程中,除了常規的業務問題外,還會重點考查數據分析的技術能力,這里就不得不提SQL了,SQL作為數據分析的筆試必考題,常常被用來檢驗候選人的技術水平,而且有些題目也是非常的刁鉆,這對于初入職場的“小白”也是非常不友好。不過不用擔心,結合自己多年的數據分析的求職和工作經驗,我們接下來會有一系列文章,詳細講解數據分析面試中那些高頻出現的SQL筆試題以及各大廠的SQL筆試題,學習了這些筆試題的常見套路和解法,把這些題目都刷一遍,在接下來的筆試中應該可以一往無前,勢如破竹!,收割offer啦!
數據分析筆試中比較常考查的一個知識點就是行/列轉換,以及一行/多行轉換,因為在實際的業務中數據原本的存儲方式可能不便于我們進行分析,所以我們需要進行行/列的轉換,以及一行/多行的轉換,這個轉換過程非常常見也比較的tricky,所以也是數據分析面試中經常考查的內容!下面我們就通過實際的案例來進行講解。

02、行/列轉換

行/列轉換在做數據分析時會經常遇到,所謂的行/列轉換就是如下圖所示兩種展示形式的互相轉換。

我們假設有4款產品ABCD,分別在三個電商平臺天貓、淘寶和京東上進行銷售,下表分別以兩種形式記錄了某個月各產品(Product)在各個平臺(Platform)的銷售數量(Quqntity)。我們為了分析的方便,需要對兩種形式進行轉換,也就是我們常說的行/列轉換。

行轉列
假如我們有下表,由Product、Platform、Quantity三個字段組成,但是為了方便展示,我們需要將Platform中的每一平臺展示為一列,也就是行轉列。

方法一:PIVOT
在SQL SERVER中,提供了專門進行行列轉換的函數:PIVOT,PIVOT的一般語法是:
FROM table_source – 表名稱,即數據源
PIVOT(
聚合函數(value_column) – value_column 要轉換為 列值 的列名
FOR pivot_column – pivot_column 指定要轉換的列
IN(column_list) – column_list 自定義的目標列名
)
使用PIVOT進行行轉列的代碼如下:
SELECT *
FROM table
PIVOT (
SUM(quantity) FOR platform IN (‘天貓’,‘淘寶’,‘京東’)
)
通過上面 SQL 語句即可得到下面的結果:

PIVOT 后跟一個聚合函數SUM來拿到結果,FOR 后面跟的平臺Platform是我們要轉換的列,這樣的話平臺中的天貓、淘寶、京東就就被轉換為列。IN 后面跟的就是具體的平臺名稱。

方法二:聚合函數+CASE WHEN
需要注意的是PIVOT是SQL SERVER的內置函數,對于行列轉換非常方便,但Oracle、MySQL是不支持PIVOT函數的。我們可以用聚合函數配合CASE語句實現。使用 CASE WHEN 可以得到和 PIVOT 同樣的結果,但是沒有 PIVOT 簡單直觀。
SELECT Product,
MAX(CASE WHEN Platform=‘天貓’ THEN quantity ELSE 0 END) AS “天貓”,
MAX(CASE WHEN Platform=‘淘寶’ THEN quantity ELSE 0 END) AS “淘寶”,
MAX(CASE WHEN Platform=‘京東’ THEN quantity ELSE 0 END) AS “京東”
FROM table
GROUP BY Product

列轉行
反過來,假設我們有下表 table,各個平臺已經作為一列出現,我們需要將各個平臺匯總為一列,也就是列轉行。

方法一:UNPIVOT
與行轉列類似,在SQL SERVER中,提供了列轉行的函數:UNPIVOT,UNPIVOT的一般語法是:
FROM table_source – 表名稱,即數據源
UNPIVOT(
value_column – value_column 要轉換為 行值 的列名
FOR pivot_column – pivot_column 指定要轉換為指定的列
IN(column_list ) – column_list 目標列名
)
使用UNPIVOT進行列轉行的代碼如下:
SELECT *
FROM table
UNPIVOT (
quantity FOR Platform IN (“天貓”,“淘寶”,“京東”)
)
通過 UNPIVOT 可得到如下結果:

方法二:聚合函數+UNION
同理,Oracle,MySQL也是不支持UNPIVOT函數的,對于這種情況我們可以通過聚合函數+UNION的方式將數據組合起來。
SELECT
Product,
‘天貓’ AS Platform ,
MAX(“天貓”) AS Quantity
FROM table GROUP BY Product
UNION
SELECT
Product,
‘淘寶’ AS Platform ,
MAX(“淘寶”) AS Quantity
FROM table GROUP BY Product
UNION
SELECT
Product,
‘京東’ AS Platform ,
MAX(“京東”) AS Quantity
FROM table GROUP BY Product

03、一行/多行轉換

在數據分析中,還有一個非常常見的場景,就是需要將一行數據拓展為多行數據,或者將多行數據匯總為一行數據,這種一行/多行的數據轉換問題也是面試中頻繁考查的知識點之一,舉例如下圖所示。

一行轉多行
原數據如下:table表中有兩個字段,產品(Product)和供應商(Supplier),每個產品有多個供應商,各個供應商以逗號分割匯總為一行。現在需要將各個供應商分別展開為一行。

針對這種情況,Hive中提供了一個很高效的方法:lateral view和explode等函數一起使用,能將一行數據拆分成多行數據,在此基礎上可以對拆分的數據進行聚合,使用的時候需要注意:
1、explode接受一個數組(或一個map)作為輸入,并將數組元素(map)作為單獨的行輸出。UDTF可以在SELECT表達式列表中使用,也可以作為LATERAL VIEW的一部分使用。
2、LATERAL VIEW是配合explode(或者其他的UDTF),把單行數據拆解成多行后的數據結果集。
3、LATERAL VIEW explode要放置于from之后,where之前
SELECT DISTINCT Product,Supplier
FROM table
LATERAL VIEW explode (split(Supplier,’,’)) as t – t為新表別名
拆成后結果:

多行轉一行
反過來,我們想把多行再變回一行,需要怎么處理呢?我們可以使用:collect_set +concat_ws來實現。代碼如下:
SELECT Product,concat_ws(’,’,collect_set(Supplier)) Product_Supplier
FROM table
GROUP BY Product
最終還原為一行數據如下:

注意:上述用的到的collect_set函數,有兩個作用,第一個是去重,去除group by后的重復元素,
第二個是形成一個集合,將group by后屬于同一組的集合起來成為一個集合。與contact_ws結合使用就是將這些元素以逗號分隔的形式形成字符串。
以上就是數據分析面試—SQL高頻面試題部分的內容,部分數據分析文章請移步 共粽號:【數據分析星球】,更多數據分析面試筆試的文章持續更新中,敬請期待,如果覺得不錯,也歡迎分享、點贊哈~

總結

以上是生活随笔為你收集整理的【数据分析面试】大厂高频SQL笔试题(一)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。