sql >> Databáze >  >> RDS >> Sqlserver

SQL RANK() versus ROW_NUMBER()

Rozdíl uvidíte pouze v případě, že máte vazby v rámci oddílu pro konkrétní hodnotu objednávky.

RANK a DENSE_RANK jsou v tomto případě deterministické, všechny řádky se stejnou hodnotou pro sloupec řazení i dělení skončí se stejným výsledkem, zatímco ROW_NUMBER libovolně (nedeterministicky) přiřadí svázaným řádkům inkrementující výsledek.

Příklad: (Všechny řádky mají stejné StyleID tak jsou ve stejném oddílu a v tomto oddílu jsou první 3 řádky shodné, když jsou seřazeny podle ID )

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  

Vrá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

Můžete vidět, že u tří stejných řádků je ROW_NUMBER přírůstky, RANK hodnota zůstane stejná, pak skočí na 4 . DENSE_RANK také přiřadí stejnou hodnost všem třem řádkům, ale další odlišná hodnota má přiřazenou hodnotu 2.



  1. Připojte se k dotazu na počet na create_series() a načtěte hodnoty Null jako '0'

  2. Postgres zkopíruje Heroku Production DB do lokální vývojové DB

  3. Chyba indexovaného zobrazení se skalárními agregáty

  4. Export databáze PostgreSQL pomocí phpPgAdmin