leetcode sql 經典70題總結四(集合,行轉列,上下級)

一.集合

1.in是可以多字段使用

1112. 每位學生的最高成績

表:Enrollments

+---------------+---------+
| Column Name | Type |
+---------------+---------+
| student_id | int |
| course_id | int |
| grade | int |
+---------------+---------+
(student_id, course_id) 是該表的主鍵。

編寫一個 SQL 查詢,查詢每位學生獲得的最高成績和它所對應的科目,若科目成績并列,取 course_id 最小的一門。查詢結果需按 student_id 增序進行排序。

查詢結果格式如下所示:

Enrollments 表:
+------------+-------------------+
| student_id | course_id | grade |
+------------+-----------+-------+
| 2 | 2 | 95 |
| 2 | 3 | 95 |
| 1 | 1 | 90 |
| 1 | 2 | 99 |
| 3 | 1 | 80 |
| 3 | 2 | 75 |
| 3 | 3 | 82 |
+------------+-----------+-------+

Result 表:
+------------+-------------------+
| student_id | course_id | grade |
+------------+-----------+-------+
| 1 | 2 | 99 |
| 2 | 2 | 95 |
| 3 | 3 | 82 |
+------------+-----------+-------+

來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/highest-grade-for-each-student
著作權歸領扣網絡所有。商業轉載請聯系官方授權,非商業轉載請注明出處。

# Write your MySQL query statement below
select en.student_id,Min(en.course_id ) course_id ,en.grade
from Enrollments en 
where (en.student_id,en.grade) in(
  select e.student_id,Max(e.grade) max_grade
  from Enrollments e 
  group by e.student_id    
)
group by en.student_id
order by en.student_id
2.采用exist邏輯比in更好理解

585. 2016年的投資

寫一個查詢語句,將 2016 年 (TIV_2016) 所有成功投資的金額加起來,保留 2 位小數。

對于一個投保人,他在 2016 年成功投資的條件是:

他在 2015 年的投保額 (TIV_2015) 至少跟一個其他投保人在 2015 年的投保額相同。
他所在的城市必須與其他投保人都不同(也就是說維度和經度不能跟其他任何一個投保人完全相同)。
輸入格式:
表 insurance 格式如下:

Column Name Type
PID INTEGER(11)
TIV_2015 NUMERIC(15,2)
TIV_2016 NUMERIC(15,2)
LAT NUMERIC(5,2)
LON NUMERIC(5,2)

PID 字段是投保人的投保編號, TIV_2015 是該投保人在2015年的總投保金額, TIV_2016 是該投保人在2016年的投保金額, LAT 是投保人所在城市的維度, LON 是投保人所在城市的經度。

樣例輸入

PID TIV_2015 TIV_2016 LAT LON
1 10 5 10 10
2 20 20 20 20
3 10 30 20 20
4 10 40 40 40

樣例輸出

TIV_2016
45.00

解釋

就如最后一個投保人,第一個投保人同時滿足兩個條件:

  1. 他在 2015 年的投保金額 TIV_2015 為 '10' ,與第三個和第四個投保人在 2015 年的投保金額相同。
  2. 他所在城市的經緯度是獨一無二的。

第二個投保人兩個條件都不滿足。他在 2015 年的投資 TIV_2015 與其他任何投保人都不相同。
且他所在城市的經緯度與第三個投保人相同。基于同樣的原因,第三個投保人投資失敗。

所以返回的結果是第一個投保人和最后一個投保人的 TIV_2016 之和,結果是 45 。

來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/investments-in-2016
著作權歸領扣網絡所有。商業轉載請聯系官方授權,非商業轉載請注明出處。

select sum(a.TIV_2016) TIV_2016
from insurance a
where exists(
    select *
    from insurance b
    where a.pid <> b.pid and a.TIV_2015 = b.TIV_2015
)
and not exists(
    select *
    from insurance c
    where c.pid <> a.pid and c.lat = a.lat and a.lon = c.lon
)

二.行轉列

[這題用戶到排名分組和行轉列的兩種思路]

618. 學生地理信息報告

一所美國大學有來自亞洲、歐洲和美洲的學生,他們的地理信息存放在如下 student 表中。

name continent
Jack America
Pascal Europe
Xi Asia
Jane America

寫一個查詢語句實現對大洲(continent)列的 透視表 操作,使得每個學生按照姓名的字母順序依次排列在對應的大洲下面。輸出的標題應依次為美洲(America)、亞洲(Asia)和歐洲(Europe)。數據保證來自美洲的學生不少于來自亞洲或者歐洲的學生。

對于樣例輸入,它的對應輸出是:

America Asia Europe
Jack Xi Pascal
Jane

來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/students-report-by-geography
著作權歸領扣網絡所有。商業轉載請聯系官方授權,非商業轉載請注明出處。

# Write your MySQL query statement below
select Max(case when s.continent='America' then s.name else NULL end)  as America,
       Max(case when s.continent='Asia' then s.name else NULL end)  as Asia,
       Max(case when s.continent='Europe' then s.name else NULL end) Europe
from 
(select *,
 @rk:=if(@pre=t.continent,@rk+1,1) as rk,
 @pre:=t.continent as pre
 from student t,(select @pre:=NULL,@rk:=0) t1
 order by t.continent,t.name) s
group by s.rk

3.上下級

1270. 向公司CEO匯報工作的所有人

員工表:Employees

+---------------+---------+
| Column Name | Type |
+---------------+---------+
| employee_id | int |
| employee_name | varchar |
| manager_id | int |
+---------------+---------+
employee_id 是這個表的主鍵。
這個表中每一行中,employee_id 表示職工的 ID,employee_name 表示職工的名字,manager_id 表示該職工匯報工作的直線經理。
這個公司 CEO 是 employee_id = 1 的人。

用 SQL 查詢出所有直接或間接向公司 CEO 匯報工作的職工的 employee_id 。

由于公司規模較小,經理之間的間接關系不超過 3 個經理。

可以以任何順序返回的結果,不需要去重。

查詢結果示例如下:

Employees table:
+-------------+---------------+------------+
| employee_id | employee_name | manager_id |
+-------------+---------------+------------+
| 1 | Boss | 1 |
| 3 | Alice | 3 |
| 2 | Bob | 1 |
| 4 | Daniel | 2 |
| 7 | Luis | 4 |
| 8 | Jhon | 3 |
| 9 | Angela | 8 |
| 77 | Robert | 1 |
+-------------+---------------+------------+

Result table:
+-------------+
| employee_id |
+-------------+
| 2 |
| 77 |
| 4 |
| 7 |
+-------------+

公司 CEO 的 employee_id 是 1.
employee_id 是 2 和 77 的職員直接匯報給公司 CEO。
employee_id 是 4 的職員間接匯報給公司 CEO 4 --> 2 --> 1 。
employee_id 是 7 的職員間接匯報給公司 CEO 7 --> 4 --> 2 --> 1 。
employee_id 是 3, 8 ,9 的職員不會直接或間接的匯報給公司 CEO。

來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/all-people-report-to-the-given-manager
著作權歸領扣網絡所有。商業轉載請聯系官方授權,非商業轉載請注明出處。

# Write your MySQL query statement below
select distinct a.employee_id
from Employees a,Employees b,Employees c
where a.manager_id=b.employee_id and b.manager_id = c.employee_id  and c.manager_id =1 and a.employee_id <> 1
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,316評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,481評論 3 415
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,241評論 0 374
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,939評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,697評論 6 409
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,182評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,247評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,406評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,933評論 1 334
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,772評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,973評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,516評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,209評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,638評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,866評論 1 285
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,644評論 3 391
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,953評論 2 373