Problem:
I resultatuppsättningen vill du partitionera poster och rangordna rader inom varje partition, lägga till ytterligare en kolumn för att visa radernas rangordning inom partitionen.
Exempel:
Vår databas har en tabell som heter magazine med data i följande kolumner:id (primär nyckel), name , category och price .
| id | namn | kategori | pris |
|---|---|---|---|
| 105 | Boende på landet | livsstil | 1,70 |
| 108 | Nyhetsmagasin | nyheter | 3.35 |
| 115 | Decibel | musik | 6,50 |
| 123 | Drum Magazine | musik | 6,50 |
| 145 | Solnedgång | livsstil | 12.00 |
| 155 | Världen | livsstil | 9,50 |
| 158 | Tangentbord | musik | 8.45 |
Låt oss gruppera tidningar efter kategori och rangordna varje grupp i fallande ordning efter pris . Visa rankningsposition, namn, kategori och pris för varje tidning.
Lösning:
SELECT
category,
name,
price,
RANK() OVER (PARTITION BY category
ORDER BY price DESC
) AS price_rank
FROM magazine;
Här är resultatet:
| kategori | namn | pris | price_rank |
|---|---|---|---|
| livsstil | Solnedgång | 12.00 | 1 |
| livsstil | Världen | 9,50 | 2 |
| livsstil | Boende på landet | 1,70 | 3 |
| musik | Tangentbord | 8.45 | 1 |
| musik | Decibel | 6,50 | 2 |
| musik | Drum Magazine | 6,50 | 2 |
| nyheter | Nyhetsmagasin | 3.35 | 1 |
Diskussion:
För att partitionera rader och rangordna dem efter deras position inom partitionen, använd funktionen RANK() med PARTITION BY-satsen.
SQLs RANK()-funktion låter oss lägga till en posts position inom resultatuppsättningen eller inom varje partition. I vårt exempel rangordnar vi rader inom en partition.
OVER()-satsen kommer alltid efter RANK(). OVER() måste innehålla en ORDER BY-sats. Om du returnerar rankningar inom en partition, placera en PARTITION BY-sats inuti OVER()-satsen. PARTITION BY följs av ett uttryck eller kolumnnamn; i vårt exempel använder vi kolumnen category (PARTITION BY category ).
Obs! Om du inte använder partitioner kan du utelämna PARTITION BY och helt enkelt lägga in ORDER BY-satsen i OVER().
Efter PARTITION BY, placera ORDER BY följt av namnen på sorteringskolumnerna eller uttrycken. I vårt exempel sorterar vi i fallande ordning efter kolumnen price (ORDER BY price DESC ). Nyckelordet DESC indikerar en fallande sorteringsordning.
I exemplet ovan, använde RANK() med PARTITION BY delade resultaten i separata grupper av tidskrifter efter deras kategori . Med varje grupp sorterades rader efter pris och rankades sedan inom den gruppen.