Problem:
In der Ergebnismenge möchten Sie Datensätze partitionieren und Zeilen innerhalb jeder Partition ordnen, indem Sie eine weitere Spalte hinzufügen, um die Ränge der Zeilen innerhalb der Partition anzuzeigen.
Beispiel:
Unsere Datenbank hat eine Tabelle namens Magazin mit Daten in den folgenden Spalten:id
(Primärschlüssel), name
, category
und price
.
id | Name | Kategorie | Preis |
---|---|---|---|
105 | Landleben | Lebensstil | 1,70 |
108 | Nachrichtenmagazin | Neuigkeiten | 3,35 |
115 | Dezibel | Musik | 6,50 |
123 | Trommelmagazin | Musik | 6,50 |
145 | Sonnenuntergang | Lebensstil | 12.00 |
155 | Welt | Lebensstil | 9,50 |
158 | Tastatur | Musik | 8.45 |
Lassen Sie uns Zeitschriften nach Kategorie gruppieren und sortieren Sie jede Gruppe in absteigender Reihenfolge nach Preis . Anzeige der Rangposition, des Namens, der Kategorie und des Preises für jedes Magazin.
Lösung:
SELECT category, name, price, RANK() OVER (PARTITION BY category ORDER BY price DESC ) AS price_rank FROM magazine;
Hier ist das Ergebnis:
Kategorie | Name | Preis | Preis_Rang |
---|---|---|---|
Lebensstil | Sonnenuntergang | 12.00 | 1 |
Lebensstil | Welt | 9,50 | 2 |
Lebensstil | Landleben | 1,70 | 3 |
Musik | Tastatur | 8.45 | 1 |
Musik | Dezibel | 6,50 | 2 |
Musik | Trommelmagazin | 6,50 | 2 |
Neuigkeiten | Nachrichtenmagazin | 3,35 | 1 |
Diskussion:
Um Zeilen zu partitionieren und sie nach ihrer Position innerhalb der Partition zu ordnen, verwenden Sie die RANK()-Funktion mit der PARTITION BY-Klausel.
Die RANK()-Funktion von SQL ermöglicht es uns, die Position eines Datensatzes innerhalb der Ergebnismenge oder innerhalb jeder Partition hinzuzufügen. In unserem Beispiel ordnen wir Zeilen innerhalb einer Partition.
Die OVER()-Klausel kommt immer nach RANK(). OVER() muss eine ORDER BY-Klausel enthalten. Wenn Sie Ränge innerhalb einer Partition zurückgeben, platzieren Sie eine PARTITION BY-Klausel innerhalb der OVER()-Klausel. Auf PARTITION BY folgt ein Ausdruck oder Spaltenname; in unserem Beispiel verwenden wir die Spalte category
(PARTITION BY category
).
Hinweis: Wenn Sie keine Partitionen verwenden, können Sie PARTITION BY weglassen und einfach die ORDER BY-Klausel in OVER() einfügen.
Geben Sie nach PARTITION BY ORDER BY gefolgt von den Namen der Sortierspalten oder -ausdrücke ein. In unserem Beispiel sortieren wir absteigend nach der Spalte price
(ORDER BY price DESC
). Das Schlüsselwort DESC gibt eine absteigende Sortierreihenfolge an.
Im obigen Beispiel wurden die Ergebnisse durch die Verwendung von RANK() mit PARTITION BY nach ihrer Kategorie in separate Zeitschriftengruppen unterteilt . Bei jeder Gruppe wurden die Zeilen nach Preis sortiert und dann innerhalb dieser Gruppe eingestuft.