前段時間在 http://www.itput.net/ 看到 一篇文章,html
http://www.itpub.net/thread-1031306-1-4.html函數
提到一個SQL語句:spa
創建環境:.net
create table t_emp(id numeric(10)
,name varchar(10),
salary numeric(10,2));htm
插入數據:get
insert into t_emp values(1,'jack',10000.50);
insert into t_emp values(2,'jack2',8000.50);
insert into t_emp values(3,'jack3',120000);
insert into t_emp values(4,'jack4',5000);
insert into t_emp values(5,'jack5',3000);it
要求:取出t_emp表中salary列中第2高的人和倒數第2高的人SQL語句。用一條SQL語句取出來io
通常的寫法以下:table
select * from (select emp.*, row_number() over (order by salary asc) as rank from t_emp emp) t
where rank=2
union all
select * from (select emp.*, row_number() over (order by salary desc) as rank from t_emp emp) t
where rank=2thread
這裏使用了row_number()這個分析函數.但還不是最好的。後來想了想,這樣寫會有個問題就是有重複的,
若有多個第二的,和多個倒數第二。
能夠這樣寫:
select * from (select emp.*, DENSE_RANK() over (order by salary desc) as rank,
DENSE_RANK() over (order by salary asc) as rank1
from t_emp emp) t
where (rank=2 or rank1=2)
使用:
row_number(): 主要是分頁
DENSE_RANK():排名(順序始終是連續的),適合剛纔的取出薪水排名(有重複的)
RANK():排名(列有重複,區間就是不連續的,如:1,2,2,4,4,6...)
NTILE(N):分組函數,把記錄強制分紅N段