單挑力扣(LeetCode)SQL題:1308. 不同性別每日分數總計

相信很多學習SQL的小伙伴都面臨這樣的困境,學習完書本上的SQL基礎知識后,一方面想測試下自己的水平;另一方面想進一步提升,卻不知道方法。

其實,對于技能型知識,我的觀點一貫都是:多練習、多實踐。正所謂實踐出真知,學完書本的知識,很多時候也只能做到知道,距離熟練的應用還差的很遠。

在咱們程序員圈子里,力扣(LeetCode)和牛客(nowcoder.com)是兩個公認比較好的實踐平臺。題庫比較多,還有不少大廠的筆試真題,特別適合找工作時擼一擼。當然,作為平時個人技術提升的練習題,也是非常不錯的。

最近一段時間,我會先從力扣(LeetCode)的SQL題刷起。當然,順序可能是隨機的,歡迎小伙伴們點題。

題目:1308. 不同性別每日分數總計

(通過次數9,381 | 提交次數12,628,通過率74.29%)

表: Scores+---------------+---------+
| Column Name   | Type    |
+---------------+---------+
| player_name   | varchar |
| gender        | varchar |
| day           | date    |
| score_points  | int     |
+---------------+---------+
(gender, day)是該表的主鍵
一場比賽是在女隊和男隊之間舉行的
該表的每一行表示一個名叫 (player_name) 性別為 (gender) 的參賽者在某一天獲得了 (score_points) 的分數
如果參賽者是女性,那么 gender 列為 'F',如果參賽者是男性,那么 gender 列為 'M'寫一條SQL語句查詢每種性別在每一天的總分。
返回按gender和day對查詢結果 升序排序的結果。
查詢結果格式的示例如下。示例 1:
輸入:
Scores表:
+-------------+--------+------------+--------------+
| player_name | gender | day        | score_points |
+-------------+--------+------------+--------------+
| Aron        | F      | 2020-01-01 | 17           |
| Alice       | F      | 2020-01-07 | 23           |
| Bajrang     | M      | 2020-01-07 | 7            |
| Khali       | M      | 2019-12-25 | 11           |
| Slaman      | M      | 2019-12-30 | 13           |
| Joe         | M      | 2019-12-31 | 3            |
| Jose        | M      | 2019-12-18 | 2            |
| Priya       | F      | 2019-12-31 | 23           |
| Priyanka    | F      | 2019-12-30 | 17           |
+-------------+--------+------------+--------------+
輸出:
+--------+------------+-------+
| gender | day        | total |
+--------+------------+-------+
| F      | 2019-12-30 | 17    |
| F      | 2019-12-31 | 40    |
| F      | 2020-01-01 | 57    |
| F      | 2020-01-07 | 80    |
| M      | 2019-12-18 | 2     |
| M      | 2019-12-25 | 13    |
| M      | 2019-12-30 | 26    |
| M      | 2019-12-31 | 29    |
| M      | 2020-01-07 | 36    |
+--------+------------+-------+
解釋:
女性隊伍:
第一天是 2019-12-30,Priyanka 獲得 17 分,隊伍的總分是 17 分
第二天是 2019-12-31, Priya 獲得 23 分,隊伍的總分是 40 分
第三天是 2020-01-01, Aron 獲得 17 分,隊伍的總分是 57 分
第四天是 2020-01-07, Alice 獲得 23 分,隊伍的總分是 80 分
男性隊伍:
第一天是 2019-12-18, Jose 獲得 2 分,隊伍的總分是 2 分
第二天是 2019-12-25, Khali 獲得 11 分,隊伍的總分是 13 分
第三天是 2019-12-30, Slaman 獲得 13 分,隊伍的總分是 26 分
第四天是 2019-12-31, Joe 獲得 3 分,隊伍的總分是 29 分
第五天是 2020-01-07, Bajrang 獲得 7 分,隊伍的總分是 36 分來源:力扣(LeetCode)
鏈接:https://leetcode.cn/problems/running-total-for-different-genders

#測試數據
Create table If Not Exists Scores (player_name varchar(20), gender varchar(1), day date, score_points int);insert into Scores (player_name, gender, day, score_points) values ('Aron', 'F', '2020-01-01', '17');
insert into Scores (player_name, gender, day, score_points) values ('Alice', 'F', '2020-01-07', '23');
insert into Scores (player_name, gender, day, score_points) values ('Bajrang', 'M', '2020-01-07', '7');
insert into Scores (player_name, gender, day, score_points) values ('Khali', 'M', '2019-12-25', '11');
insert into Scores (player_name, gender, day, score_points) values ('Slaman', 'M', '2019-12-30', '13');
insert into Scores (player_name, gender, day, score_points) values ('Joe', 'M', '2019-12-31', '3');
insert into Scores (player_name, gender, day, score_points) values ('Jose', 'M', '2019-12-18', '2');
insert into Scores (player_name, gender, day, score_points) values ('Priya', 'F', '2019-12-31', '23');
insert into Scores (player_name, gender, day, score_points) values ('Priyanka', 'F', '2019-12-30', '17');

解題思路:

這道題在題目上其實有些描述不太準確的地方。

首先,題目里描述scores表的主鍵是(gender, day),但實際上,表里還有一個player_name的字段,難道每天同一個性別只有一個player(當然題目中給出的樣例數據確實是這樣,雖然跟實際情況可能不太相符)?

所以,相對來說,scores表的主鍵是(player_name, day)會比較合理一些。而gender僅僅是player_name的一個屬性而已。

其次,題目要求計算“每種性別在每一天的總分”。根據題目下面的解釋,可以知道,這個“總分”,其實是從最開始日期累計到當天的總分,而不僅僅是當天的分數加總。

基于以上兩點,我們再來看這道題。

源表scores的主鍵是(player_name, day),結果數據的主鍵是(gender, day)。而同一個gender下可能會存在多個player_name,所以,在計算上,需要做一次group by匯總操作。

簡單來看,如果僅僅是計算每天每個性別的總分,那直接使用下面的SQL語句就可以了。


selectgender,day,sum(score_points) as total
from scores
group by gender,day
order by gender,day;

但題目實際上要求的是計算累計值,即:最開始的那一天到現在的累計總分。

關于累計的計算,在SQL編寫的過程中,其實是一個比較經典,也比較常見的需求。常見于各類分析報表中。

思路上,一般來說,都是先構造出一個累加到每天的明細數據,然后再分組匯總即可。

具體到這道題,上面的SQL已經計算出了每天每個gender的匯總值,那么再將每一天的數據發散到所有比它大的日期上,最后再以gender+day分組匯總即可。

參考SQL:

with
total_score as  (selectgender,day,sum(score_points) as totalfrom scoresgroup by gender,dayorder by gender,day
)
selecta.gender,a.day,sum(b.total) as total
from total_score a
inner join total_score b
on a.gender = b.gender
and a.day >= b.day
group by a.gender,a.day
order by a.gender,a.day;

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/452811.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/452811.shtml
英文地址,請注明出處:http://en.pswp.cn/news/452811.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

需求與范圍駕馭深刻反省總結

每天都在講范圍、說需求,真的到了想整理出點什么的時候,卻一下子不知從何說起。也許是熟悉麻痹癥吧。根據我的破經歷,在需求方面有幾個是最搞人的,只要我們方法得當,雖然不一定能夠完全駕馭,但起碼可以改善…

16. vim

vim編輯器是vi的升級版本,帶顏色顯示安裝yum install -y vim-enhanced將passwd文件復制到其他目錄下,vim后沒有顏色 一般模式上下左右方向鍵或kjhl四個鍵移動光標n方向鍵 向特定方向移動n位ctrl b 或 pageup 向上翻頁ctrl f 或 pagedown 向下翻頁0或sh…

軟件生命周期

軟件生命周期由軟件定義、軟件開發和運行維護 ( 也稱為軟件維護 )3 個時期組成,每個時期又進一步劃分成若干個 階段 。

Jmeter(三)_配置元件

HTTP Cookie Manager 用來存儲瀏覽器產生的用戶信息 Clear Cookies each Iteration:每次迭代請求,清空cookies,GUI中定義的任何cookie都不會被清除。Implementation:默認HC4CookieHandlerCookie Policy:將用于管理Cook…

山寨版項目管理經驗小結

不知道這個標題是否合適。 忙了互聯網,再忙作軟件,今天好不容易閑下來,寫點最近總結的一些經驗。最近在和北京幾家大的軟件公司的合作過程中,也許我所看到的,可能不代表全部,但是值得從事這個行業的人重視。…

Django項目--首頁靜態化

0前言 1.使用Celery生成靜態頁面 task.py中新增任務函數generate_static_index_html(),任務函數生成靜態頁面。 app.task def generate_static_index_html():產生首頁靜態頁面# 獲取商品的種類信息types GoodsType.objects.all()# 獲取首頁輪播商品信息goods_bann…

C語言指針,申請、釋放內存,線程

2019獨角獸企業重金招聘Python工程師標準>>> 1:普通情況下,C語言的指針是使用虛擬地址,并非物理地址; 2:C語言mallco函數可以根據輸入的值,申請一塊連續的內存;free(*p&a…

Docker在Ubuntu16.04上安裝

轉自:http://blog.51cto.com/collen7788/2047800 1、添加Docker源 sudo apt-get update 2、增加CA證書 sudo apt-get install apt-transport-https ca-certificates 3、添加GPG Key(一種加密手段) sudo apt-key adv --keyserver hkp://p80.pool.sks-keyservers.net:…

java偽協議_通過偽協議解決父頁面與iframe頁面通信的問題

我們經常會有父頁面與iframe頁面的操作,比如這個iframe里面的內容是js寫的。如以下代碼var iframe document.getElementById("iframe"),doc iframe.contentWindow.document;doc.open();doc.write("---------something------");doc.close();以…

Django項目--靜態首頁的數據緩存(設置、獲取、更新)

0 前言 將處理計算的結果先臨時保存起來,下次使用的時候可以先直接使用,如果沒有這個備份的數據,重新進行計算處理。 將緩存數據保存在內存中 (本項目中保存在redis中) cache注意事項: 1)如果…

關于騰訊算法大賽

騰訊算法大賽 本文參考于我協會前會長吳師兄的文檔 騰訊社交廣告高校算法大賽是面向高校大學生的算法大賽,作為騰訊核心的廣告業務單元,騰訊社交廣告通過對海量社交數據進行深入分析,構建多樣廣告場景,與8億用戶連接對話。在大數據…

列表推導式

#麻煩辦法new_lst []for i in range(10): new_lst.append(i**2)print(new_lst)#簡單辦法print([i**2 for i in range(10)])# 小題下面列表中取余list_a [1,2,3,-5,20,-7]print([i%2 for i in list_a])# 30以內所有能被3整除的數print([won for won in range(30) if won%3 …

軟件過程

軟件過程是為了獲得高質量軟件所需要完成的一系列任務的框架,它規定了完成各項任務的工作步驟。 軟件過程描述為了開發出客戶需要的軟件,什么人(who)、在什么時候(when)、做什么事(what&#x…

【總結整理】JavaScript的DOM事件學習(慕課網)

事件:在文檔或者瀏覽器窗口中發生的一些,特定的交互瞬間 HTML和JavaScript的交互通過事件 來實現 比如:1.滾動條向下滑動,加載圖片 2.圖片輪播,鼠標由2-5頁調換 本章內容1、理解事件流2、使用事件處理程序3、不同的事件…

Python面試題總結(6)--數據類型(綜合)

1. Python 里面如何實現 tuple 和 list 的轉換? 答: Python 中的類型轉換,一般通過類型強轉即可完成 tuple 轉 list 使用 list() 方法 list 轉 tuple 使用 tuple() 方法 2. 我們知道對于列表可以使用切片操作進行部分元素的選擇&#xff0c…

項目經理需要的思維批判

想做好項目經理,就一定要改變你的思維方式。這對于技術出身的朋友尤其重要。 清末人們自以為天朝,他國皆為蠻夷。結果如何呢?喪師辱國,自己淪為病夫。其根本莫非自己腦筋不對頭?后來又搞洋務運動,以為洋人…

NavigationView更改菜單icon和title顏色變化效果

NavigationView menu默認icon和title會隨著菜單狀態改變而改變,選擇某個菜單后再次打開側邊菜單后會發現該菜單的icon和title會變成應用的主顏色,其他菜單項仍然為黑色。 如果想關閉系統默認的這個效果,有兩種方式: 1. XML布局文件…

java項目打鏡像_docker通過dockerfile打java項目鏡像

環境:centos7思路:java -jar 啟動的項目打包成docker images進行運行創建dockerfile——>創建shell腳本——>打包images1、dockerfile內容如下[rootk8s-master xxl-execl]# more dockerfile#網上拖取java8的鏡像FROM java:8MAINTAINER zhangshan-m…

什么是數據庫

數據庫(Database,簡稱DB)是長期儲存在計算機內、有組織的、可共享的大量數據的集合。1.數據庫的基本特征2.數據按一定的數據模型組織、描述和儲存3.可為各種用戶共享4.冗余度較小5.數據獨立性較高6.易擴展