對所有員工的當前(to_date='9999-01-01')薪水按照salary進行按照1-n的排名,相同salary並列且按照emp_no公升序排列
create table `salaries` (
`emp_no` int(11) not null,
`salary` int(11) not null,
`from_date` date not null,
`to_date` date not null,
primary key (`emp_no`,`from_date`));
分析:本題的主要思想是復用salaries表進行比較排名,具體思路如下:
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 順序排列輸出結果
解答:select s1.emp_no, s1.salary, count(distinct s2.salary) as rank
from salaries as s1, salaries as s2
where s1.to_date =
'9999-01-01'
and s2.to_date =
'9999-01-01'
and s1.salary <= s2.salary
group by s1.emp_no
order by s1.salary desc, s1.emp_no asc
mysql 按兩列排序嗎 按兩列排序MySQL表
這可能有助於某人正在尋找通過兩列排序表的方法,但是以相似的方式。這意味著使用聚合排序功能組合兩種排序。例如,在使用全文搜尋檢索文章以及文章發布日期時,它非常有用。這只是乙個例子,但是如果你理解了這個想法,你可以找到很多要使用的聚合函式。您甚至可以對列進行加權,使其優先於一秒鐘。我的功能從兩種型別中都...
mysql兩列相加 MySQL 按兩列分組並求和
建立庫存系統。我有很多產品,每個產品都有三個不同的變數。因此,對於總庫存,我想按兩列 產品和尺寸 和總數量分組以獲得總庫存。product size quantity widget one 2 275 widget one 2 100 widget two 3 150 widget two 2 15...
mysql執行計畫列說明
本文介紹了mysql 執行計畫列說明。select查詢的序列號,包含一組數字,表示查詢中執行select子句或操作表的順序 三種情況 id相同,執行順序由上至下 id不同,如果是子查詢,id的序號會遞增,id值越大優先順序越高,越先被執行 id相同不同,同時存在 型別描述 簡單的select查詢,查...