2016-09-09 87 views

回答

2

此promlem該解決方案易於使用的GroupWise完成最大方法通過基於每個行的較高數字將表加入自身。使用此方法,您可以檢索任何最喜歡的位置,取決於聯接的數量或計算單個聯接中的行數。取決於你最喜歡什麼方法(IMO第二個計數更優雅)。

下面是使用GroupWise的方法爲你的問題的解決方案:

SELECT s1.sal 
FROM job_salary s1 
LEFT JOIN job_salary s2 ON s1.sal < s2.sal 
LEFT JOIN job_salary s3 ON s2.sal < s3.sal 
GROUP BY s1.sal 
HAVING MAX(s3.sal) IS NULL AND MAX(s2.sal) IS NOT NULL 

或計數的連接匹配的數量:

SELECT s1.sal 
FROM job_salary s1 
LEFT JOIN job_salary s2 ON s1.sal < s2.sal 
GROUP BY s1.sal 
HAVING COUNT(DISTINCT s2.sal) = 1 

順便說一句,如果你這樣做:

SELECT s1.sal, COUNT(DISTINCT s2.sal) AS sals_higher 
FROM job_salary s1 
LEFT JOIN job_salary s2 ON s1.sal < s2.sal 
GROUP BY s1.sal 
ORDER BY s1.sal DESC 

您可以看到結果從最高到最低工資排序,以及序號s1中的每一行都表示來自s2的連接行數。當您在條件s1.sal < s2.sal上加入表格時,對於每一行,它將加入s2以上的工資數目,該數字高於s1中的當前工資。
例如,在最高薪水上,沒有比這更高的薪水,因爲這是最高的薪水,這就是爲什麼你得到0,而在第二高的薪水中,我們只有一個薪水更高,這是最高的,這是爲什麼我們得到了1等等。
這裏的結果看起來的樣子:

+------+-------------+ 
| sal | sals_higher | 
+------+-------------+ 
| 7100 | 0   | 
| 7000 | 1   | 
| 6900 | 2   | 
| 5400 | 3   | 
| 5000 | 4   | 
| 4700 | 5   | 
+------+-------------+ 

現在,所有你需要做的就是在HAVING條款,而你的情況等於1提供了適合的條件。

祝你好運! :-)

+0

工作好人 – sms

0

這將努力找到第n個最大數量(自動遞增)

SELECT 
    TOP 1 * from (SELECT TOP nth_largest_no * FROM Products Order by sal desc) ORDER BY sal asc; 

對於第五大salery

SELECT 
    TOP 1 sal from (SELECT TOP 5 sal FROM sal Order by price desc) ORDER BY sal asc; 
相關問題