MySQL刷題 牛客網 Day4

2021-10-03 03:30:52 字數 3579 閱讀 9217

直接來看題!

對所有員工的薪水按照salary進行按照1-n的排名

對所有員工的當前(to_date=『9999-01-01』)薪水按照salary進行按照1-n的排名,相同salary並列且按照emp_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`))

;

這道題主要的難點在於給出salary的排名,即建立新的rank列,且要求是存在並列排名,最後的輸出格式按照emp_no公升序(1-n意思是指salary降序排列)。

這裡給出兩種題解思路,當然還有更多的思路。

思路一首先介紹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表使用兩次,命名為s1s2,從而進行比較排名,具體思路如下(摘自牛客網使用者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

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`))

;

本題重點在於建立兩張新的表,一張是所有員工工資的表,一張是所有部門經理工資的表,重點在於兩張表的內容包括dept_no、emp_no和salary。

有了思路之後,答案便迎刃而解:

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.電路交換技術 解析 廣域網的通訊子網主要使用分組交換技術。廣域網是由許多交...