SQL練習71:牛客每個人最近的登錄日期6
題目鏈接:牛客網
題目描述
牛客每天有很多人登錄,請你統計一下牛客每個用戶查詢刷題資訊,包括: 用戶的名字,以及截止到某天,累計總共通過了多少題, 不存在沒有登錄卻刷題的情況,但是存在登錄了沒刷題的情況,不會存在刷題表里面,有提交代碼沒有通過的情況,但是會記錄在刷題表里,只不過通過數目是0,
有一個登錄(login)記錄表,簡況如下:

第1行表示id為2的用戶在2020-10-12使用了客戶端id為1的設備登錄了牛客網,
…
第5行表示id為3的用戶在2020-10-13使用了客戶端id為2的設備登錄了牛客網,
有一個刷題(passing_number)表,簡況如下:

第1行表示id為2的用戶在2020-10-12通過了4個題目,
…
第3行表示id為1的用戶在2020-10-13提交了代碼但是沒有通過任何題目,
第4行表示id為4的用戶在2020-10-13通過了2個題目
還有一個用戶(user)表,簡況如下:

請你寫出一個sql陳述句查詢刷題資訊,包括: 用戶的名字,以及截止到某天,累計總共通過了多少題,并且查詢結果先按照日期升序排序,再按照姓名升序排序,有登錄卻沒有刷題的哪一天的資料不需要輸出,上面的例子查詢結果如下:

查詢結果表明:
fh在2020-10-12為止,總共通過了4道題,輸出為4,
wangchao在2020-10-12為止,總共通過了1道題,總計為1,
tm在2020-10-12為止只登陸了沒有刷題,故沒有顯示出來,
tm在2020-10-13為止刷了題,但是卻沒有通過任何題目,總計為0,
wangchao在2020-10-13通過2道,但是加上前面2020-10-12通過1道,故在2020-10-13為止總共通過了3道題,總計為3,
解法
根據題目的要求,并不需要使用到login表,可以采用sum函式進行開窗處理,按user_id進行磁區,再通過date升序排序,進而實作了在每個user_id磁區中以升序日期排序的通過題數的逐個遞加,之后使用左外連接將結果與user表連接,
SELECT name AS u_n, date, SUM(number) OVER(PARTITION BY user_id ORDER BY date) AS ps_num
FROM passing_number p
LEFT JOIN USER u
ON p.user_id = u.id
ORDER BY date, u_n
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/259987.html
標籤:其他
上一篇:解決執行緒的安全問題
