Database
 sql >> Datenbank >  >> RDS >> Database

So ordnen Sie Zeilen innerhalb einer Partition in SQL

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.