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

SQL RANK()とROW_NUMBER()

    特定の順序値のパーティション内に同点がある場合にのみ、違いがわかります。

    RANK およびDENSE_RANK この場合、は決定論的であり、順序付け列と分割列の両方で同じ値を持つすべての行は同じ結果になりますが、ROW_NUMBER 結合された行に任意に(非決定論的に)増分結果を割り当てます。

    例: (すべての行のStyleIDは同じです したがって、同じパーティション内にあり、そのパーティション内では、IDで並べ替えると最初の3行が結び付けられます。 )

    WITH T(StyleID, ID)
         AS (SELECT 1,1 UNION ALL
             SELECT 1,1 UNION ALL
             SELECT 1,1 UNION ALL
             SELECT 1,2)
    SELECT *,
           RANK() OVER(PARTITION BY StyleID ORDER BY ID)       AS 'RANK',
           ROW_NUMBER() OVER(PARTITION BY StyleID ORDER BY ID) AS 'ROW_NUMBER',
           DENSE_RANK() OVER(PARTITION BY StyleID ORDER BY ID) AS 'DENSE_RANK'
    FROM   T  
    

    返品

    StyleID     ID       RANK      ROW_NUMBER      DENSE_RANK
    ----------- -------- --------- --------------- ----------
    1           1        1         1               1
    1           1        1         2               1
    1           1        1         3               1
    1           2        4         4               2
    

    3つの同じ行について、ROW_NUMBER 増分、RANK 値は同じままで、4にジャンプします 。 DENSE_RANK また、3つの行すべてに同じランクが割り当てられますが、次の個別の値には2の値が割り当てられます。



    1. T-SQL(SQL Server)で重複キーエラーを無視する方法

    2. SQLServer待機イベント-3

    3. Windows用の良いpostgresqlクライアント?

    4. SQL Server 2017(データベースエンジン)の新機能