SQL Server - How to get secondary MAX value by subquery

日前在做一個SQL練習,有提到如何去取出某欄位的值是第二大的所有欄位資料,且如果有

多筆的話也要一起列出 (表示有相等的第二大值)。

SQL語法使用環境為:SQL Server 2008 R2

table資料如下:


從該table看來,Salary第二大的值為50000,因此要如何列出這兩列的資料?

一、考慮如何排除最大的value該欄位

如果你在正常的table下使用MAX(Salary),勢必只會取得Salary = 80000的資料

  1. SELECT MAX(Salary) FROM Employees



如何排除掉這筆資料? 可以使用子查詢的觀念

即你的table過濾條件是以另一個table塞選出的data為過濾,如下面的語法,搭配NOT IN使用

,排除最大MAX(Salary)的value

  1. SELECT MAX(Salary) FROM Employees
  2. where
  3. Salary NOT IN(Select MAX(Salary) FROM Employees)

排除掉80000該筆資料,那麼剩下最大的即為50000



二、如何取得所有欄位的資料且Salary相等的也要考慮

由上面可以得知,若在欄位使用了該彙總函數

就無法列出其它的欄位(以上面的語法看來),只會得到單筆資料及單一一個欄位

這時我又想到子查詢的觀念,若50000已經是我們要的了,那我們就再以該結果為塞選條件

在外層下一個新的SELECT,如下:

  1. SELECT * FROM Employees
  2. WHERE
  3. Salary IN (
  4. SELECT MAX(Salary) FROM Employees
  5. where
  6. Salary NOT IN(Select MAX(Salary) FROM Employees)
  7. )
新的SELECT將列出所有的欄位,條件為該Salary滿足50000的該筆!

如此一來就會得到下面的結果:


感覺就是在做巢狀子查詢一樣XD

留言