sql >> Database >  >> RDS >> Database

Hoe rijen binnen een partitie in SQL te rangschikken?

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.


  1. Spotlight Tuning Pack Basic:de beste gratis SQL-optimalisatietool

  2. Vragen die u moet stellen voordat u een database start

  3. Herhaal een string meerdere keren in MySQL - REPEAT()

  4. Identiteitstoename in SQL Server 2012-kolom springt van 6 naar 1000+ bij 7e invoer