sql >> Database teknologi >  >> RDS >> Database

Sådan rangeres rækker i en partition i SQL

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.


  1. Generer dynamisk kolonner i PostgreSQL

  2. Find overtrædelser af fremmednøgler i SQLite

  3. Brug af ODBC med Salesforce og Active Directory Federation Services (ADFS) Single Sign On (SSO)

  4. Multiple indsæt SQL oracle