sql查詢最大的見多了,查詢第二的呢???


問題:

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

 

建表語句

create table users
(
    id int identity(1,1) primary key,
    name varchar(20),
    height float
);

 

數據庫表:用戶表(Users

數據庫字段

字段意義

數據類型

約束

備注

id

編號

int

主鍵

自增長

name

姓名

VARCHAR(20)

 

 

height

身高

float

 

 

 

測試數據

insert into users(name,height) values('zhangsan',182);
insert into users(name,height) values('李四',122);
insert into users(name,height) values('張強',132);
insert into users(name,height) values('王明',122);
insert into users(name,height) values('姜明',182);
insert into users(name,height) values('蔣克龍',182);
insert into users(name,height) values('zhang',182);
insert into users(name,height) values('安安',181);
insert into users(name,height) values('健健',181);
insert into users(name,height) values('明明',181);
insert into users(name,height) values('小小',177);
insert into users(name,height) values('旺旺',123);
insert into users(name,height) values('卡納',175);
insert into users(name,height) values('文鑫',166);
insert into users(name,height) values('健明',155);
insert into users(name,height) values('拉拉',152);
insert into users(name,height) values('青青',132);
insert into users(name,height) values('樂樂',155);
insert into users(name,height) values('KK',123);
insert into users(name,height) values('FF',122);
insert into users(name,height) values('Lily',152);

 

 查詢語句

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函數獲得值不同)。

  致謝:感謝您的耐心閱讀!假如有更好的答案希望不吝賜教。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM