Problem:
I resultatsættet vil du gerne partitionere poster og rangere rækker inden for hver partition, tilføje en anden kolonne for at vise rækkernes rækker inden for partitionen.
Eksempel:
Vores database har en tabel ved navn magasin med data i følgende kolonner:id
(primær nøgle), name
, category
og price
.
id | navn | kategori | pris |
---|---|---|---|
105 | Live på landet | livsstil | 1,70 |
108 | Nyhedsmagasin | nyheder | 3,35 |
115 | Decibel | musik | 6,50 |
123 | Trommemagasin | musik | 6,50 |
145 | Solnedgang | livsstil | 12.00 |
155 | Verden | livsstil | 9,50 |
158 | Tastatur | musik | 8.45 |
Lad os gruppere magasiner efter kategori og rangordner hver gruppe i faldende rækkefølge efter pris . Vis placering, navn, kategori og pris for hvert magasin.
Løsning:
SELECT category, name, price, RANK() OVER (PARTITION BY category ORDER BY price DESC ) AS price_rank FROM magazine;
Her er resultatet:
kategori | navn | pris | price_rank |
---|---|---|---|
livsstil | Solnedgang | 12.00 | 1 |
livsstil | Verden | 9,50 | 2 |
livsstil | Live på landet | 1,70 | 3 |
musik | Tastatur | 8.45 | 1 |
musik | Decibel | 6,50 | 2 |
musik | Trommemagasin | 6,50 | 2 |
nyheder | Nyhedsmagasin | 3,35 | 1 |
Diskussion:
For at opdele rækker og rangere dem efter deres placering i partitionen, skal du bruge funktionen RANK() med PARTITION BY-sætningen.
SQLs RANK() funktion giver os mulighed for at tilføje en posts position i resultatsættet eller inden for hver partition. I vores eksempel rangerer vi rækker i en partition.
OVER()-sætningen kommer altid efter RANK(). OVER() skal indeholde en ORDER BY-klausul. Hvis du returnerer rækker inden for en partition, skal du placere en PARTITION BY-sætning inde i OVER()-sætningen. PARTITION BY efterfølges af et udtryk eller kolonnenavn; i vores eksempel bruger vi kolonnen category
(PARTITION BY category
).
Bemærk: Hvis du ikke bruger partitioner, kan du udelade PARTITION BY og blot sætte ORDER BY-sætningen i OVER().
Efter PARTITION BY placeres ORDER BY efterfulgt af navnene på sorteringskolonnerne eller -udtrykkene. I vores eksempel sorterer vi i faldende rækkefølge efter kolonnen price
(ORDER BY price DESC
). DESC nøgleordet angiver en faldende sorteringsrækkefølge.
I ovenstående eksempel, ved at bruge RANK() med PARTITION BY opdelte resultaterne sat i separate grupper af magasiner efter deres kategori . Med hver gruppe blev rækker sorteret efter pris og derefter rangeret i den gruppe.