SQL優化--使用分析函數

前段時間在 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() ,NTILE分析函數的確有時方便,如分頁,取指定行,和排名等

      使用:

             row_number(): 主要是分頁

             DENSE_RANK():排名(順序始終是連續的),適合剛纔的取出薪水排名(有重複的)

             RANK():排名(列有重複,區間就是不連續的,如:1,2,2,4,4,6...)

             NTILE(N):分組函數,把記錄強制分紅N段

相關文章
相關標籤/搜索