直接來看題!
對所有員工的薪水按照salary進行按照1-n的排名
對所有員工的當前(to_date=『9999-01-01』)薪水按照salary進行按照1-n的排名,相同salary並列且按照emp_no公升序排列
這道題主要的難點在於給出salary的排名,即建立新的rank列,且要求是存在並列排名,最後的輸出格式按照emp_no公升序(1-n意思是指salary降序排列)。create
table
`salaries`
(`emp_no`
int(11)
notnull
,`salary`
int(11)
notnull
,`from_date`
date
notnull
,`to_date`
date
notnull
,primary
key(
`emp_no`
,`from_date`))
;
這裡給出兩種題解思路,當然還有更多的思路。
思路一首先介紹row_number()、rank()、dense_rank()這幾個視窗函式的具體區別,row_number()給出的排名是按照順序1234,其中就算同分排名也不會一致;rank()給出的排名是同分有一致的,按照順序1224,即最後一名的名次即為總人數;dense_rank()給出的排名是1223,即同分排名一致,但是排名不會出現空缺。
語句如下,
思路二select emp_no, salaries, dense_rank(
)over
(order
by salary desc
)as rank
where to_date =
'9999-01-01'
order
by salary desc
, emp_no asc
第二種思路不用視窗函式,主要思想是對相同的salaries表使用兩次,命名為s1和s2,從而進行比較排名,具體思路如下(摘自牛客網使用者ciphersaw的答案):
link
1、從兩張相同的salaries表(分別為s1與s2)進行對比分析,先將兩表限定條件設為to_date = 『9999-01-01』,挑選出當前所有員工的薪水情況。
2、本題的精髓在於 s1.salary <= s2.salary,意思是在輸出s1.salary的情況下,有多少個s2.salary大於等於s1.salary,比如當s1.salary=94409時,有3個s2.salary(分別為94692,94409,94409)大於等於它,但由於94409重複,利用count(distinct s2.salary)去重可得工資為94409的rank等於2。其餘排名以此類推。
3、千萬不要忘了group by s1.emp_no,否則輸出的記錄只有一條(可能是第一條或者最後一條,根據不同的資料庫而定),因為用了合計函式count()
4、最後先以 s1.salary 逆序排列,再以 s1.emp_no 順序排列輸出結果
獲取員工其當前的薪水比其manager當前薪水還高的相關資訊
獲取員工其當前的薪水比其manager當前薪水還高的相關資訊,當前表示to_date=『9999-01-01』,
結果第一列給出員工的emp_no,
第二列給出其manager的manager_no,
第三列給出該員工當前的薪水emp_salary,
第四列給該員工對應的manager當前的薪水manager_salary
本題重點在於建立兩張新的表,一張是所有員工工資的表,一張是所有部門經理工資的表,重點在於兩張表的內容包括dept_no、emp_no和salary。create
table
`dept_emp`
(`emp_no`
int(11)
notnull
,`dept_no`
char(4
)not
null
,`from_date`
date
notnull
,`to_date`
date
notnull
,primary
key(
`emp_no`
,`dept_no`))
;create
table
`dept_manager`
(`dept_no`
char(4
)not
null
,`emp_no`
int(11)
notnull
,`from_date`
date
notnull
,`to_date`
date
notnull
,primary
key(
`emp_no`
,`dept_no`))
;create
table
`salaries`
(`emp_no`
int(11)
notnull
,`salary`
int(11)
notnull
,`from_date`
date
notnull
,`to_date`
date
notnull
,primary
key(
`emp_no`
,`from_date`))
;
有了思路之後,答案便迎刃而解:
select sem.emp_no as emp_no,
sdm.emp_no as manager_no,
sem.salary as emp_salary,
sdm.salary as manager_salary
from
(select s.salary, s.emp_no, de.dept_no
from salaries s inner
join dept_emp de
on s.emp_no = de.emp_no
and s.to_date =
'9999-01-01'
)as sem,
(select s.salary, s.emp_no, dm.dept_no
from salaries s inner
join dept_manager dm
on s.emp_no = dm.emp_no
and s.to_date =
'9999-01-01'
)as sdm
where sem.dept_no = sdm.dept_no
and sem.salary > sdm.salary
牛客網刷題day4
1.下列 中的錯誤是 d 1 public class test 2 8 a.非法的表示式 i 1 b.找不到符號i c.類不應為public d.尚未初始化變數i 解析 在方法內定義的變數在使用之前必須初始化,否則報錯。3.在資料報網路中,每個分組攜帶有目的地主機的位址。a a.是b.否 解析 資...
MySQL刷題 牛客網 Day2
今天繼續刷題!獲取所有員工當前的manager 獲取所有員工當前的manager,如果當前的manager是自己的話結果不顯示,當前表示to date 9999 01 01 結果第一列給出當前員工的emp no,第二列給出其manager對應的manager no。create table dept...
牛客網刷題day3
1.傳輸介質是通訊網路中傳送方和接收方之間的 a 通路。a.物理 b.邏輯 c.虛擬 d.數字 2.廣域網覆蓋的地方範圍從幾十公里到幾千公里,它的通訊子網主要使用 b a.報文交換技術 b.分組交換技術 c.檔案交換技術 d.電路交換技術 解析 廣域網的通訊子網主要使用分組交換技術。廣域網是由許多交...