回転:SqlServerの4つのソート:ROW_NUMBER()/RANK()/DENSE_RANK()/ntile() over()

5800 ワード

詳細
原文転載先:http://blog.csdn.net/a5685263/article/details/52187070
 
以下は転載内容です.
まず、いくつかのテストデータを作成します.
if OBJECT_ID('Tempdb.dbo.#Tmp') is not null
    drop table #Tmp
create table #Tmp
(
name nvarchar(10)
)

insert into #Tmp
select N'  '
union
select N'  '
union 
select N'  '
union 
select N'  '
union
select N'  '
union
select N'  '
union all
select N'  '

PS:最後のunionはunion allを使っています.私たちは「張三」が1行多いからです.
 
一、ROW_NUMBER() over(partition by columnname order by columnname):
select ROW_NUMBER()over(order by name) as num,* from #Tmp

名前順の結果セットが得られます.转:SqlServer四种排序:ROW_NUMBER()/RANK()/DENSE_RANK()/ntile() over()_第1张图片 ROW_NUMBER()over()には、カラムをグループ化してソートする方法もあります.次の結果、張三には1と2の2つのソートがあり、他の名前のソートは1しかありません.
select ROW_NUMBER()over(partition by name order by name) as num,* from #Tmp

結果:转:SqlServer四种排序:ROW_NUMBER()/RANK()/DENSE_RANK()/ntile() over()_第2张图片
 
二、RANK()over(order by columnname):次の結果セットから見ると、結果セットは5の番号が少なく、4の番号が2つあって、直接番号6にジャンプします.
select RANK()over(order by name),* from #Tmp

結果:转:SqlServer四种排序:ROW_NUMBER()/RANK()/DENSE_RANK()/ntile() over()_第3张图片   三、DENSE_RANK()over(order by columnname):
select DENSE_RANK()over(order by name),* from #Tmp

Sqlを実行すると、次の結果セットに2つの番号4の行があり、その直後に番号5の行があることがわかります.DENSE_RANK()関数とRANK()関数の差は多くない.RANK()関数は、いくつかのグループに分けても、最後の番号は必ず行数と同じです.DENSE_RANK()関数の最後の番号は、パケットの数に関係します.转:SqlServer四种排序:ROW_NUMBER()/RANK()/DENSE_RANK()/ntile() over()_第4张图片  
四、NTILE()OVER(ORDER BY COLUMNNAME):
select NTILE(2)over(order by name),* from #Tmp
select NTILE(3)over(order by name),* from #Tmp

NTILEの後ろの数字は、クエリの結果を平均していくつかのグループに分けます.下図のように2と3つのグループに分かれています.行数が平均して残りの行がある場合は、行を一番前のグループに分けます.例えば私たちの結果は7行あり、3組に分けられます.では、第1グループ3行、第2グループ2行、第3グループ2行です.もし私たちの結果が14行あれば、平均3グループに分けます.では、第1グループ5行、第2グループ5行、第3グループ4行です.このように推す.转:SqlServer四种排序:ROW_NUMBER()/RANK()/DENSE_RANK()/ntile() over()_第5张图片  
 
  • 转:SqlServer四种排序:ROW_NUMBER()/RANK()/DENSE_RANK()/ntile() over()_第6张图片
  • サイズ:14.3 KB
  • 转:SqlServer四种排序:ROW_NUMBER()/RANK()/DENSE_RANK()/ntile() over()_第7张图片
  • サイズ:14.6 KB
  • 转:SqlServer四种排序:ROW_NUMBER()/RANK()/DENSE_RANK()/ntile() over()_第8张图片
  • サイズ:13 KB
  • 转:SqlServer四种排序:ROW_NUMBER()/RANK()/DENSE_RANK()/ntile() over()_第9张图片
  • サイズ:13.5 KB
  • 转:SqlServer四种排序:ROW_NUMBER()/RANK()/DENSE_RANK()/ntile() over()_第10张图片
  • サイズ:28.6 KB
  • 添付ファイルを表示