Hello:奚痢蹂匹!結(jié)束快樂的旅行~今天是SQL DAY 5啦~
一起來看看今天有什么題目吧~
闖關(guān)開始!
關(guān)卡1-??員工薪水中位數(shù)
思路:
在做這道題之前戚揭,我們需要了解窗口函數(shù)
因為我們要創(chuàng)建兩個新的column:一個在每個company中排序雕旨,產(chǎn)生row number; 另一個column是count這個company有多少員工
最后計算row_number = 中位數(shù)
SELECT?Id,?Company,?Salary
FROM
(SELECT?Id,?Company,?Salary,
????ROW_NUMBER()?OVER?(PARTITION?BY?company?ORDER?BY?Salary?ASC,?id?ASC)?AS?row_num,
????COUNT(Id)?OVER?(PARTITION?BY?company)?AS?count_id
????FROM?Employee ) AS?ans
WHERE?row_num?IN?(FLOOR((count_id?+?1)/2),?FLOOR((count_id?+?2)/2))
最后一行這么寫的原因是,如果count id 為奇數(shù)悲柱,比如3锋喜,那么floor(4/2) = 2, floor(5/2)=2豌鸡,當(dāng)他為偶數(shù)嘿般,那就返回兩個值。符合了我們題目的要求涯冠。
恭喜過關(guān)炉奴!進(jìn)入下一關(guān)!
關(guān)卡2 -? 至少有5名直接下屬的經(jīng)理
思路:
自連接之后就可以很好的完成啦~~
記得count可以在having里面使用~而having是在group by后面~~
select?distinct?b.name?from?employee?a, employee?b
where?a.ManagerId?=?b.Id
group?by?b.Id
having?count(b.Id)?>=?5
恭喜過關(guān)蛇更!進(jìn)入下一關(guān)瞻赶!
關(guān)卡3 -?當(dāng)選者
思路:
首先有兩張表,我們一定是要先把兩張表join在一起
加完我們先以姓名分組派任,再按照每個分組的計數(shù)給分組降序排序砸逊,使用?limit 1?取第一名即可。
select?c.name?from?candidate?c
join?vote?v
on?c.id?=?v.CandidateId
group?by?c.name
order?by?count(v.CandidateId)?desc
limit?1
恭喜過關(guān)掌逛!進(jìn)入下一關(guān)师逸!
關(guān)卡4 -?查詢回答率最高的問題
思路:
我們先排除answer為null的情況
再按照問題分組
然后降序排序出?count(answer_id) ,看看回答的次數(shù)
最后limit1豆混,就可以啦
答案:
select?question_id?as?survey_log
from?survey_log
where?answer_id?is?not?null
group?by?question_id
order?by?count(answer_id)?desc
limit?1
恭喜過關(guān)篓像!進(jìn)入下一關(guān)动知!
關(guān)卡5 -?查詢員工的累計薪水
思路:
還記得day4的關(guān)卡3嗎~ 也是一道求累計和的題, 當(dāng)時我說他的精髓在于讓?a.month?>=?b.month 然后group by a.id 和 a.month, 這里也是一樣,我們以后可以養(yǎng)成這樣的思維员辩,就是當(dāng)要求cumulative的和拍柒,我們就這么做。當(dāng)然屈暗,記得第一行是sum(b.salary)拆讯。
現(xiàn)在我們來解決另一個問題,題目還要求取掉最大月之后养叛,求剩下每個月的近三個月工資?
所以我們用a.month-3 <?b.month?限制只對最近三個月工資求和种呐。
另外創(chuàng)建一個子查詢,?(a.id, a.month)?not?in?(select?id,?max(month)?from?employee?group?by?id)
通過限制not in max(month) 弃甥,我們排除了最大的月份爽室。
答案:
select?a.id, a.month, sum(b.salary)?as?Salary?from?employee?a,?employee?b
where?a.id?=?b.id
and?a.month?>=?b.month
and?a.month-3 <?b.month?
and?(a.id, a.month)?not?in?(select?id,?max(month)?from?employee?group?by?id)
group?by?a.id, a.month
order?by?id?asc, month?desc
恭喜過關(guān)!
今天學(xué)到的新知識:兩個新的窗口函數(shù)淆攻,?ROW_NUMBER()?OVER?(PARTITION?BY ) 計算第幾行, COUNT()?OVER?(PARTITION?BY ) 計算出現(xiàn)的個數(shù)阔墩;求最大不一定要max(), order by 然后 limit 1 也是很好的選擇。靈活運用瓶珊,is null 和is not null啸箫;類似python中cunsum()求累計之和的套路。
明天繼續(xù)闖關(guān)~yay ~