回転:SqlServerの4つのソート:ROW_NUMBER()/RANK()/DENSE_RANK()/ntile() over()
5800 ワード
詳細
原文転載先:http://blog.csdn.net/a5685263/article/details/52187070
以下は転載内容です.
まず、いくつかのテストデータを作成します.
PS:最後のunionはunion allを使っています.私たちは「張三」が1行多いからです.
一、ROW_NUMBER() over(partition by columnname order by columnname):
名前順の結果セットが得られます. ROW_NUMBER()over()には、カラムをグループ化してソートする方法もあります.次の結果、張三には1と2の2つのソートがあり、他の名前のソートは1しかありません.
結果:
二、RANK()over(order by columnname):次の結果セットから見ると、結果セットは5の番号が少なく、4の番号が2つあって、直接番号6にジャンプします.
結果: 三、DENSE_RANK()over(order by columnname):
Sqlを実行すると、次の結果セットに2つの番号4の行があり、その直後に番号5の行があることがわかります.DENSE_RANK()関数とRANK()関数の差は多くない.RANK()関数は、いくつかのグループに分けても、最後の番号は必ず行数と同じです.DENSE_RANK()関数の最後の番号は、パケットの数に関係します.
四、NTILE()OVER(ORDER BY COLUMNNAME):
NTILEの後ろの数字は、クエリの結果を平均していくつかのグループに分けます.下図のように2と3つのグループに分かれています.行数が平均して残りの行がある場合は、行を一番前のグループに分けます.例えば私たちの結果は7行あり、3組に分けられます.では、第1グループ3行、第2グループ2行、第3グループ2行です.もし私たちの結果が14行あれば、平均3グループに分けます.では、第1グループ5行、第2グループ5行、第3グループ4行です.このように推す.
サイズ:14.3 KB サイズ:14.6 KB サイズ:13 KB サイズ:13.5 KB サイズ:28.6 KB 添付ファイルを表示
原文転載先: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
名前順の結果セットが得られます. ROW_NUMBER()over()には、カラムをグループ化してソートする方法もあります.次の結果、張三には1と2の2つのソートがあり、他の名前のソートは1しかありません.
select ROW_NUMBER()over(partition by name order by name) as num,* from #Tmp
結果:
二、RANK()over(order by columnname):次の結果セットから見ると、結果セットは5の番号が少なく、4の番号が2つあって、直接番号6にジャンプします.
select RANK()over(order by name),* from #Tmp
結果: 三、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()関数の最後の番号は、パケットの数に関係します.
四、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行です.このように推す.