Probleem:
In de resultatenset wil je records partitioneren en rijen rangschikken binnen elke partitie, en een andere kolom toevoegen om de rijen van rijen binnen de partitie weer te geven.
Voorbeeld:
Onze database heeft een tabel met de naam tijdschrift met gegevens in de volgende kolommen:id
(primaire sleutel), name
, category
, en price
.
id | naam | categorie | prijs |
---|---|---|---|
105 | Landelijk wonen | levensstijl | 1,70 |
108 | Nieuwsmagazine | nieuws | 3.35 |
115 | Decibel | muziek | 6.50 |
123 | Drum Magazine | muziek | 6.50 |
145 | Zonsondergang | levensstijl | 12:00 |
155 | Wereld | levensstijl | 9,50 |
158 | Toetsenbord | muziek | 8,45 |
Laten we tijdschriften groeperen op categorie en rangschik elke groep in aflopende volgorde op prijs . Geef de positie, naam, categorie en prijs van elk tijdschrift weer.
Oplossing:
SELECT category, name, price, RANK() OVER (PARTITION BY category ORDER BY price DESC ) AS price_rank FROM magazine;
Hier is het resultaat:
categorie | naam | prijs | price_rank |
---|---|---|---|
levensstijl | Zonsondergang | 12:00 | 1 |
levensstijl | Wereld | 9,50 | 2 |
levensstijl | Landelijk wonen | 1,70 | 3 |
muziek | Toetsenbord | 8,45 | 1 |
muziek | Decibel | 6.50 | 2 |
muziek | Drum Magazine | 6.50 | 2 |
nieuws | Nieuwsmagazine | 3.35 | 1 |
Discussie:
Gebruik de functie RANK() met de clausule PARTITION BY om rijen te partitioneren en ze te rangschikken op hun positie binnen de partitie.
Met de functie RANK() van SQL kunnen we de positie van een record toevoegen aan de resultatenset of binnen elke partitie. In ons voorbeeld rangschikken we rijen binnen een partitie.
De clausule OVER() komt altijd na RANK(). OVER() moet een ORDER BY-clausule bevatten. Als u rangen binnen een partitie retourneert, plaatst u een PARTITION BY-component in de OVER()-component. PARTITION BY wordt gevolgd door een uitdrukking of kolomnaam; in ons voorbeeld gebruiken we de kolom category
(PARTITION BY category
).
Opmerking: Als u geen partities gebruikt, kunt u PARTITION BY weglaten en gewoon de ORDER BY-component in OVER() plaatsen.
Plaats na PARTITION BY ORDER BY gevolgd door de namen van de sorteerkolommen of -expressies. In ons voorbeeld sorteren we in aflopende volgorde op de kolom price
(ORDER BY price DESC
). Het DESC-sleutelwoord geeft een aflopende sorteervolgorde aan.
In het bovenstaande voorbeeld verdeelde het gebruik van RANK() met PARTITION BY de resultaten in afzonderlijke groepen tijdschriften op hun categorie . Bij elke groep werden rijen gesorteerd op prijs en vervolgens gerangschikt binnen die groep.