3道常見的SQL筆試題,你要不要來試試!

2021-03-01 猿人菌

        都說「金九銀十」,馬上十月份即將結束,相信還有相當多的小夥伴沒找到合適的工作。在筆試過程中,總會出現那麼一兩道「有趣」的SQL題,來檢測應聘者的一個邏輯思維,這對於初入職場的「小白」也是非常不友好。不用擔心,本篇博客,博主整理了幾道在面試中高頻出現的「SQL」筆試題,助你在接下來的面試中一往無前,勢如破竹!         

1、查詢連續登陸3天以上的用戶

        這是一道非常經典的問題,這裡提供其中一種思路。

        表信息如下圖:

        

step1: 用戶登錄日期去重

        因為一個用戶同一天可能登錄多次,所以我們首先需要用用戶登錄日期去重。

select DISTINCT date(date) as "日期",id from demo01;

        查詢結果:

step2: 用row_number() over()函數計數

        有了第一步去重後的結果,我們可以對其進行開窗,以id分組,日期升序排序,獲取到每個日期的排名。

select *,row_number() over(PARTITION by id order by `日期`) as cum from (select DISTINCT date(date) as `日期`,id from demo01)a;

        查詢結果:                相信看到這裡,各位小夥伴已經看出其中的「玄機」了~為什麼我們需要在這一步對時間進行一個排序呢?

        可以發現,用row_number開窗之後的名次是連續的,那麼如果日期也是連續的,它們的差值不就是一個固定的值了嗎?

step3:日期減去計數值得到結果

        因為菌哥這裡演示用的是hql,所以這裡獲取日期差值使用了date_sub函數。

select *,date_sub(`日期`,cum) as `結果` from (select *,row_number() over(PARTITION by id order by `日期`) as cum from (select DISTINCT date(date) as `日期`,id from demo01)a)b;

        查詢結果:        

step4:根據id和結果分組並計算count

        最後一步,我們直接根據step3中獲取到的差值,根據id和差值進行一個分組求count即可。如果是要求連續登錄3天以上,我們直接判斷 count 的個數大於等於3即可。

select id,count(*) from (select *,date_sub(`日期`,cum) as `結果` from (select *,row_number() over(PARTITION by id order by `日期`) as cum from (select DISTINCT date(date) as `日期`,id from demo01)a)b)c GROUP BY id,`結果` having count(*)>=3;

        運行結果:

        答案已經出來了,id為1和3的用戶至少連續登錄了3天及以上,他們分別連續登錄的時長為3天和4天。

2、統計每個用戶的累計訪問次數

        這個同樣也是經常在筆試中出現的題目,大家可以根據作者的思路回顧一下:

        表信息如下圖:

        要求使用SQL統計出每個用戶的累積訪問次數,如下表所示:

用戶id月份小計累積u012017-011111u012017-021223u022017-011212u032017-0188u042017-0133step1: 修改數據格式

        從結果反推,需要查詢實現按照 年-月 分組的數據,所以我們這一步先對原數據進行一個處理。

select
     userId,
     date_format(regexp_replace(visitDate,'/','-'),'yyyy-MM') mn,
     visitCount
from
     action;t1

        處理結果:

step2: 計算每人單月訪問量

        為了讓子查詢看起來更加的美觀,我們這裡先用t1代替上一步的結果。通過這一步,我們就可以獲取到每個用戶,每個月的訪問量。

select
    userId,
    mn,
    sum(visitCount) mn_count
from
    t1
group by userId,mn;t2

        查詢的結果:                

step3: 按月累計計算訪問量

        我們將第二步的結果用變量 t2 來表示。到這一步,我們用一個sum開窗函數,對userid進行分組,mn時間進行排序即可大功告成。

select
    userId,
    mn,
    mn_count,
    sum(mn_count) over(partition by userId order by mn) mn_all
from t2;

        最終結果:

完整SQL

        溫馨提示:上述的步驟展示的都是不完整的SQL,每步使用變量代替前一步的SQL語句只是為了方便給大家展示,實際上運行的結果都是作者將完整的SQL放進去跑的哈~

select
    userId,
    mn,
    mn_count,
    sum(mn_count) over(partition by userId order by mn) mn_all
from
(   select
        userId,
        mn,
        sum(visitCount) mn_count
    from
         (select
             userId,
             date_format(regexp_replace(visitDate,'/','-'),'yyyy-MM') mn,
             visitCount
         from
             action)t1
group by userId,mn)t2;

3、分組TopN

        有50W個店鋪,每個顧客訪客訪問任何一個店鋪的任何一個商品時都會產生一條訪問日誌,訪問日誌存儲的表名為Visit,訪客的用戶id為user_id,被訪問的店鋪名稱為shop。

                需求:每個店鋪訪問次數top3的訪客信息。輸出店鋪名稱、訪客id、訪問次數。

step1:查詢每個店鋪被每個用戶訪問次數

        因為我們最終需要獲取每個店鋪訪問量top3的用戶信息,所以在這一步,我們就先把每個店鋪的每個用戶的訪問次數計算出來。

select shop,user_id,count(*) ct
from visit
group by shop,user_id;t1

        計算結果:

step2:計算每個店鋪被用戶訪問次數排名

        有了第一步每個店鋪下所被訪問用戶的訪問量,我們想獲取前三,毫無疑問,我們需要使用到開窗函數 rank。

        可能就有朋友問了,為什麼不能用 row_number

        主要還是 row_number 對於相同數據的排名不是一樣的,如果我們取Topic3,出現了相同訪問次數的數據,那我們肯定都得保留下來的對吧~~

select shop,user_id,ct,rank() over(partition by shop order by ct) rk
from t1;t2

        計算結果:

step3: 取每個店鋪排名前3的數據

        有了 step2 的結果,我們想要取每個店鋪前三的數據豈不是輕而易舉~

select shop,user_id,ct
from t2
where rk<=3;

        計算結果:

完整SQL

        好了,結果已經查詢出來了,這裡把上面step的SQL整合到一起~

select 
shop,
user_id,
ct
from
(select 
shop,
user_id,
ct,
rank() over(partition by shop order by ct) rk
from 
(select 
shop,
user_id,
count(*) ct
from visit
group by 
shop,
user_id)t1
)t2
where rk<=3;

結語

        我們不論是看書還是刷題,不在於數量多少,而一定要求「精」。這就要求我們學會去思考,學會舉一反三。真正具備解題能力的人,我相信一定不是把時間花在大量刷題上,而是懂得從不同類型的習題上,及時總結複習的人。

        以上3道SQL「小菜」怕是滿足不了大夥,以後有機會再為大家總結些別的題目,本篇文章到這裡就結束了。對技術宇宙充滿好奇,喜歡本文的朋友,可以掃碼關注作者原創公眾號【猿人菌】,我們下期見!

掃碼關注     關注即可獲取高質量思維導圖,網際網路一線大廠面經,大數據珍藏精品書籍...期待您的關注!

相關焦點

  • 三道常見的SQL筆試題,你要不要來試試!
    在筆試過程中,總會出現那麼一兩道「有趣」的SQL題,來檢測應聘者的一個邏輯思維,這對於初入職場的「小白」也是非常不友好。不用擔心,本篇博客,博主整理了幾道在面試中高頻出現的「SQL」筆試題,助你在接下來的面試中一往無前,勢如破竹!
  • 讓Excel成為SQL的學習法!(附筆試原題)
    小匿 | 作者知乎專欄 | 來源https://zhuanlan.zhihu.com/p/30212389SQL,數據分析崗的必備技能,你可以不懂Python,R,不懂可視化,不懂機器學習。但SQL,你必須懂。要不然領導讓你跑個數據來匯.
  • 華為面試三道題
    27日做了華為筆試,3道題2小時。前面將把三道題分別列一下,供後來者自己做。在後面說明一下自己的寫法第一題:題目說的比較複雜,讀懂題意之後大致是,9個字符一組,每組的第一個字符是標誌位,後面8個字符是地址。如果標誌位是0,地址逆序,標誌位是1地址不變。輸入說明:一個字符串,有多組字符,中間沒有空格。輸出說明:輸出最後的地址,每組地址用空格隔開,最後一個輸出不需要空格。
  • 你也被騰訊產培筆試虐到了嗎?
    最近菌菌在網上衝浪的時候康到了一道今年騰訊產培的筆試題,手痒痒的點開來看看,突然感覺還是自己太知識匱乏了…話不多說,和菌菌來康康是怎麼一肥事吧!嗯?這樣的筆試題,你能頂住多少?有機智的小夥伴可能就會說了,我頂不住,難道我還躲不過!
  • 最新 | 中國電信2020筆試真題,中國移動、中國聯通、中國電信筆試題庫哪裡找?
    中國電信每年校招競爭都比較大,每個省電信公司每個招聘季要接收將近2000份簡歷。行測部分重點把握推理和資料分析題,需要多刷題。你有什麼優勢?最大收穫的項目經歷是什麼?總之比較簡單,事先稍微準備一下就行。二面二面形式:無領導小組討論+筆試3個面試官,一次12個人材料:電信存在四個需要解決的問題,要求按照緊迫性排序,給出排序理由和解決方案5分鐘閱讀,每人一分鐘闡述,20分鐘討論,3分鐘總結髮言。
  • 不吹不擂,你想要的Python面試都在這裡了【315+道題】
    道題嘗嘗吧,後面有時間再繼續補充。有緣人如果看到這些題,不妨留言一下答案,來證明下你到底有多水,哈哈哈哈哈哈哈哈哈哈哈第一部分 Python基礎篇(80題)1、為什麼學習Python?2、通過什麼途徑學習的Python?3、Python和Java、PHP、C、C#、C++等其他語言的對比?4、簡述解釋型和編譯型程式語言?
  • SQL面試題洩露!做完這50道練習題你就過關了!
    做完這些題,恭喜你!你的 SQL 就算過關了!1.課程表 Course(C#,Cname,T#) C# --課程編號,Cname 課程名稱,T# 教師編號3. 教師表 Teacher(T#,Tname)T# 教師編號,Tname 教師姓名4.
  • 戴爾公司的12道面試題,已橫掃HR界!
    戴爾公司有一條招聘經驗:在新招來的員工中
  • 被這10道Java面試題虐哭了
    整整 10 道 Java 面試題,小王一道也沒答正確。他沮喪地給我說,「哥,說點我的情況,你願意聽嗎?我和一個女孩相處,女孩大我兩歲,我非科班。本來打算國慶換一家薪水高點的,好確認關係。後來我就安慰他,要他端正心態,先把這些面試題整明白,然後繼續找工作,不要想太多。借這個機會,我就把小王遇到的這 10 道面試題分享出來,希望能對其他小夥伴一些幫助。
  • 這些燒腦的牛津大學面試題,你能答出幾道?不服來戰!
    ✩ 解答提示:常見的動植物是非常普遍的考點,這道題主要考察你的思辨能力。Red can signal either 'don't eat me' or 'eat me' to consumers.我儘量通過他們知道的事情來評判他們,而非他們不知道的。▌If I were to visit the area where you live, what would I be interested in?如果我到你的家鄉,我會對什麼感興趣?✩ 解答提示:這道題考查的是你的「地理思維」以及對世界的好奇心。
  • 30道經典SQL面試題講解(11-20)
    本篇節選自書籍《對比Excel,輕鬆學習SQL數據分析》一書,主要講解數據分析面試中常見的30道SQL面試題。1-10題見:30道經典SQL面試題講解(1-10)11 行列互換現在我們有下面這麼一個表row_col_table,這個表中每年每月的銷量是一行數據:year_nummonth_numsales2019110020192200201933002019440020201200202024002020360020204800
  • 常見SQL面試題知識點+使用技巧
    因此對於應聘者來說,關鍵在於不僅要根據樣本數據編寫出正確的查詢,而且還要像對待現實數據集一樣考慮各種場景和邊緣情況。在這篇文章中,我將介紹 SQL 面試問題中常見的模式,並提供一些在 SQL 查詢中巧妙處理它們的技巧。
  • SQL面試必刷題(1) Case When
    SQL語言是每個開發人員必備的一種技能,本文對面試過程中常見的SQL面試題進行分類、匯總,每類題型包括一些例題,希望大家能夠舉一反三。
  • 滙豐銀行(HSBC), 你的AC面題?
    Summer Internship ProgrammeAC 五個環節Peer exercise:隨機分為2人一組 4個辯題可選 10mins討論準備 5mins向pre做presentation HR讓我們自己評價團隊合作Role Play:兩個pre扮演客戶想要投資一個行業,給你一頁紙新聞
  • 五道IQ測試題,看你是不是天才?敢不敢來挑戰一下智商
    引導語:今天為大家準備了五道測試IQ的題目,如果全都答對了,那你就是一個人人羨慕的天才了;答對四題,也還不錯,是一個帥才;答對三題,湊合吧,還有一個將才的稱號
  • 做數據sql不熟練?解析50道經典面試題,sql從入門到進階
    明天要面試,十萬火急!!!數據下午出,火燒眉毛了!!!阿狗怎麼辦???
  • 四大筆試最新真題 | 還不開始準備Online Test這個必經關卡,你就要被小妖精抓走啦!
    Online Test更是每家都有,每年都在而作為卡在正式面試前的筆試小妖精OT 卻是各個流程裡面最老實的一個只要你好好練習以往的OT原題100% Pass Online Test完全可以做到這篇推文裡羅福特姐姐就為各位
  • 每日一練 | Data Scientist & Business Analyst & Leetcode 面試題 1043
    Data Application Lab 自2017年6月15日起,每天和你分享討論一道數據科學(DS)和商業分析(BA)領域常見的面試問題。