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.