sql >> データベース >  >> RDS >> Sqlserver

NTILE()がSQLServerでどのように機能するか

    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                 |
    +------------+----------+---------+-------------------+
    

    1. JDBCを使用するときにSQLステートメントのロギングを有効にする方法

    2. 問題セット1-エンティティの特定

    3. Oracleで非稼働時間をなくす方法

    4. MySQL JOIN ON vs USING?