SQL Serverでは、NTILE()
関数を使用すると、順序付けられたパーティションの行を指定された数のグループに分散できます。グループには1から始まる番号が付けられます。各行について、NTILE()
行が属するグループの番号を返します。
関数を呼び出すときに、必要な数のグループを指定するだけです。
構文
構文は次のようになります:
NTILE (integer_expression) OVER ( [] < order_by_clause > )
integer_expression 各パーティションを分割する必要のあるグループの数を指定する正の整数式です。タイプはintにすることができます 、または bigint 。
FROM
によって生成された結果セットを分割します 関数が適用されるパーティションへの句。
NTILE()
の順序を決定します 値はパーティションの行に割り当てられます。
例1-基本的な使用法
この関数がどのように機能するかを示す基本的な例を次に示します。
SELECT Player, Score, NTILE(4) OVER (ORDER BY Score DESC) 'NTILE' FROM Scoreboard;
結果:
+----------+---------+---------+ | Player | Score | NTILE | |----------+---------+---------| | Bart | 2010 | 1 | | Burns | 1270 | 1 | | Meg | 1030 | 2 | | Marge | 990 | 2 | | Lisa | 710 | 3 | | Ned | 666 | 3 | | Apu | 350 | 4 | | Homer | 1 | 4 | +----------+---------+---------+
この場合、8つの結果があり、NTILE()
に提供する値があります。 は4であるため、値は4つのグループに均等に分散されます。
例2–NTILE値を変更する
NTILE()
を変更するとどうなりますか 値を3にします。
SELECT Player, Score, NTILE(3) OVER (ORDER BY Score DESC) 'NTILE' FROM Scoreboard;
結果:
+----------+---------+---------+ | Player | Score | NTILE | |----------+---------+---------| | Bart | 2010 | 1 | | Burns | 1270 | 1 | | Meg | 1030 | 1 | | Marge | 990 | 2 | | Lisa | 710 | 2 | | Ned | 666 | 2 | | Apu | 350 | 3 | | Homer | 1 | 3 | +----------+---------+---------+
結果は3つのグループに分散されます。ご想像のとおり、最後のグループは2行だけになります(他のグループの3行と比較して)。
例3–順序を切り替える
昇順と降順を切り替えると、通常はNTILE()
になります。 異なる行に適用されている値。
SELECT Player, Score, NTILE(4) OVER (ORDER BY Score DESC) 'NTILE Descending', NTILE(4) OVER (ORDER BY Score ASC) 'NTILE Ascending' FROM Scoreboard ORDER BY Score DESC;
結果:
+----------+---------+--------------------+-------------------+ | Player | Score | NTILE Descending | NTILE Ascending | |----------+---------+--------------------+-------------------| | Bart | 2010 | 1 | 4 | | Burns | 1270 | 1 | 4 | | Meg | 1030 | 2 | 3 | | Marge | 990 | 2 | 3 | | Lisa | 710 | 3 | 2 | | Ned | 666 | 3 | 2 | | Apu | 350 | 4 | 1 | | Homer | 1 | 4 | 1 | +----------+---------+--------------------+-------------------+
ただし、これは、結果セットに含まれる行数とNTILEの数によって異なります。明らかに、NTILE()
値が1の場合、違いはありません。
SELECT Player, Score, NTILE(1) OVER (ORDER BY Score DESC) 'NTILE Descending', NTILE(1) OVER (ORDER BY Score ASC) 'NTILE Ascending' FROM Scoreboard ORDER BY Score DESC;
結果:
+----------+---------+--------------------+-------------------+ | Player | Score | NTILE Descending | NTILE Ascending | |----------+---------+--------------------+-------------------| | Bart | 2010 | 1 | 1 | | Burns | 1270 | 1 | 1 | | Meg | 1030 | 1 | 1 | | Marge | 990 | 1 | 1 | | Lisa | 710 | 1 | 1 | | Ned | 666 | 1 | 1 | | Apu | 350 | 1 | 1 | | Homer | 1 | 1 | 1 | +----------+---------+--------------------+-------------------+
NTILE()
に関係なく、結果セットに1行だけが含まれている場合も、同じことが起こります。 値:
SELECT Player, Score, NTILE(4) OVER (ORDER BY Score DESC) 'NTILE Descending', NTILE(4) OVER (ORDER BY Score ASC) 'NTILE Ascending' FROM Scoreboard WHERE Score > 2000 ORDER BY Score DESC;
結果:
+----------+---------+--------------------+-------------------+ | Player | Score | NTILE Descending | NTILE Ascending | |----------+---------+--------------------+-------------------| | Bart | 2010 | 1 | 1 | +----------+---------+--------------------+-------------------+
例4–パーティション
PARTITION BY
を使用できます 結果をパーティションに分割する句。これを行うときは、NTILE()
各パーティションに適用されます。
例:
SELECT TeamName, Player, Score, NTILE(2) OVER (PARTITION BY TeamName ORDER BY Score ASC) 'NTILE' FROM Scoreboard s INNER JOIN Team t ON t.TeamId = s.TeamId;
結果:
+------------+----------+---------+-------------------+ | TeamName | Player | Score | NTILE | |------------+----------+---------+-------------------| | Mongrels | Apu | 350 | 1 | | Mongrels | Ned | 666 | 1 | | Mongrels | Meg | 1030 | 2 | | Mongrels | Burns | 1270 | 2 | | Simpsons | Homer | 1 | 1 | | Simpsons | Lisa | 710 | 1 | | Simpsons | Marge | 990 | 2 | | Simpsons | Bart | 2010 | 2 | +------------+----------+---------+-------------------+