1. 程式人生 > >如何一條sql語句查找表中第二大值

如何一條sql語句查找表中第二大值

roman splay 排名 數據庫 依然 sel col eight over

例1:

一個Customer表,一個字段Value,現請問如何查到Value中第二大的值

select max(value) from Customer where value < (select max(value) from Customer)

例2:

數據庫中人表有三個屬性,用戶(編號,姓名,身高),查詢出該身高排名第二的高度。

1、查詢出沒有重復值的第二名,即假如最高的身高是182,有幾個人同時身高是182,則查出身高小於182的的最高的身高值。

1>、方式1:

select MAX(height) from users where height < (select MAX(height) from users );

    意義:先查詢出最高的身高值,然後查詢身高小於該值的最高身高。

2>、方式2:

select top 1 height from users where height not in (select MAX(height) from users) order by height desc;

  意義:先查詢出最高的身高,排除該身高,然後將數據進行排序(降序),查詢出當前的第一條數據。

3>、方式3:使用RANK()函數

  rank函數考慮到了over子句中排序字段值相同的情況,值相同的時候RANK函數的到的值相等。

select top 1 height from (
select *,RANK() OVER (ORDER BY height desc) AS Rank from users
) t where rank<>1

  意義:給每一個記錄一個行號,使用RANK函數,去掉身高值最高的記錄(重復值的rank函數獲得值相同)。

  

2、查詢出可能與最高身高值相同的第二名,即假如身高最高是182,有幾個人同時是182身高,第二名依然是182.

1>、方式1:

select top 1 * from  (select top 2 height from users order by height desc) s order by height asc;

  意義:將數據按照身高(降序)排列,查詢出前面的兩項,然後將這兩項按照身高升序,查詢第一項目。

2>、方式2:row_number函數的用途是非常廣泛,這個函數的功能是為查詢出來的每一行記錄生成一個序號(不考慮重復值)。

select top 1 height from (
select *,ROW_NUMBER() OVER (ORDER BY height desc) AS Rank from users
) t where rank<>1

  意義:給每一個記錄一個行號ROW_NUMBER使用函數,去掉身高值最高的記錄(重復值的ROW_NUMBER函數獲得值不同)。

如何一條sql語句查找表中第二大值