RANK gibt Ihnen das Ranking innerhalb Ihrer bestellten Partition. Krawatten erhalten den gleichen Rang, wobei die nächsten Ränge übersprungen werden. Wenn Sie also 3 Gegenstände auf Rang 2 haben, wird der nächste aufgeführte Rang auf Rang 5 gesetzt.
DENSE_RANK gibt Ihnen erneut das Ranking innerhalb Ihrer geordneten Partition, aber die Ränge sind aufeinanderfolgend. Es werden keine Ränge übersprungen, wenn Ränge mit mehreren Elementen vorhanden sind.
Nullen hängen von der ORDER BY-Klausel ab. Hier ist ein einfaches Testskript, mit dem Sie spielen können, um zu sehen, was passiert:
with q as(select10 deptno,'rrr' empname,10000.00 sal from dual unionallselect11,'nnn',20000.00from dual unionallselect11,'mmm',5000.00from dual unionallselect12,'kkk',30000from dual unionallselect10,'fff',40000from dual unionallselect10,'ddd',40000from dual unionallselect10,'bbb',50000from dual unionallselect10,'xxx',nullfrom dual unionallselect10,'ccc',50000from dual)select empname, deptno, sal
, rank()over(partitionby deptno orderby sal nulls first) r
, dense_rank()over(partitionby deptno orderby sal nulls first) dr1
, dense_rank()over(partitionby deptno orderby sal nulls last) dr2
from q;
EMP DEPTNO SAL R DR1 DR2
--- ---------- ---------- ---------- ---------- ----------
xxx 10114
rrr 1010000221
fff 1040000332
ddd 1040000332
ccc 1050000543
bbb 1050000543
mmm 115000111
nnn 1120000222
kkk 12300001119rows selected.
Sehr gute Idee, Select Union All aus Dual zu verwenden, um Beispieldaten zu generieren, ohne eine Tabelle zu erstellen
Jean-Christophe Blanchard
@ Jean-ChristopheBlanchard, obwohl Sie genauso gut eine valuesKlausel verwenden könnten .
Wildcard
1
@ Wildcard In PG ja. In Oracle nein . Zumindest nicht ab 11. Ich bin noch nicht auf 12 in Prod gestoßen.
jpmc26
Entfernen Sie from dualfür die Generierung dieser Daten in Redshift
Gaurav
4
Ivan, RANK gibt mir eine Idee, wo ich relativ zu all denen bin, die vor mir liegen. DENSE_RANK sagt mir den absoluten Rang. Ich habe vielleicht das zweithöchste Gehalt, aber es könnten 100 Leute vor mir sein. Welches besser ist, hängt von der Frage ab, die ich beantworte.
CREATETABLE t ASSELECT'a' v FROM dual UNIONALLSELECT'a'FROM dual UNIONALLSELECT'a'FROM dual UNIONALLSELECT'b'FROM dual UNIONALLSELECT'c'FROM dual UNIONALLSELECT'c'FROM dual UNIONALLSELECT'd'FROM dual UNIONALLSELECT'e'FROM dual;SELECT
v,
ROW_NUMBER()OVER(ORDERBY v) row_number,
RANK()OVER(ORDERBY v) rank,
DENSE_RANK()OVER(ORDERBY v) dense_rank
FROM t
ORDERBY v;
Das Obige ergibt:
+---+------------+------+------------+| V | ROW_NUMBER | RANK | DENSE_RANK |+---+------------+------+------------+| a |1|1|1|| a |2|1|1|| a |3|1|1|| b |4|4|2|| c |5|5|3|| c |6|5|3|| d |7|7|4|| e |8|8|5|+---+------------+------+------------+
In Worten
ROW_NUMBER() weist jeder Zeile einen eindeutigen Wert zu
RANK() schreibt dem gleichen Wert dieselbe Zeilennummer zu und hinterlässt "Löcher"
DENSE_RANK() schreibt dem gleichen Wert dieselbe Zeilennummer zu und hinterlässt keine "Löcher"
rank () : Wird verwendet, um einen Datensatz innerhalb einer Gruppe von Zeilen zu ordnen.
dens_rank () : Die DENSE_RANK-Funktion verhält sich wie die RANK-Funktion, weist jedoch aufeinanderfolgende Ränge zu.
Abfrage -
select
ENAME,SAL,RANK()over(orderby SAL) RANK
from
EMP;
Ausgabe -
+--------+------+------+| ENAME | SAL | RANK |+--------+------+------+| SMITH |800|1|| JAMES |950|2|| ADAMS |1100|3|| MARTIN |1250|4|| WARD |1250|4|| TURNER |1500|6|+--------+------+------+
Abfrage -
select
ENAME,SAL,dense_rank()over(orderby SAL) DEN_RANK
from
EMP;
Ausgabe -
+--------+------+-----------+| ENAME | SAL | DEN_RANK |+--------+------+-----------+| SMITH |800|1|| JAMES |950|2|| ADAMS |1100|3|| MARTIN |1250|4|| WARD |1250|4|| TURNER |1500|5|+--------+------+-----------+
Der einzige Unterschied zwischen den Funktionen RANK () und DENSE_RANK () besteht in Fällen, in denen ein „Gleichstand“ besteht. dh in Fällen, in denen mehrere Werte in einem Satz dieselbe Rangfolge haben. In solchen Fällen weist RANK () den Werten in der Menge nicht aufeinanderfolgende „Ränge“ zu (was zu Lücken zwischen den ganzzahligen Rangwerten führt, wenn ein Gleichstand besteht), während DENSE_RANK () den Werten in der Gruppe aufeinanderfolgende Ränge zuweist set (so dass es bei einem Gleichstand keine Lücken zwischen den ganzzahligen Rangwerten gibt).
Betrachten Sie beispielsweise die Menge {25, 25, 50, 75, 75, 100}. Für eine solche Menge gibt RANK () {1, 1, 3, 4, 4, 6} zurück (beachten Sie, dass die Werte 2 und 5 übersprungen werden), während DENSE_RANK () {1,1,2,3, 3,4}.
Rank () Die SQL-Funktion generiert den Rang der Daten innerhalb des geordneten Wertesatzes, aber der nächste Rang nach dem vorherigen Rang ist row_number dieser bestimmten Zeile. Andererseits generiert die SQL-Funktion Dense_Rank () die nächste Nummer, anstatt row_number zu generieren. Unten finden Sie das SQL-Beispiel, das das Konzept verdeutlicht:
Rang und dichter Rang geben den Rang im partitionierten Datensatz an.
Rank (): Es gibt keine aufeinanderfolgenden Ganzzahlen.
Dense_rank (): Sie erhalten aufeinanderfolgende Ganzzahlen.
Im obigen Bild beträgt der Rang von 10008 zip 2 nach der Funktion dens_rank () und 24 nach der Funktion rank (), wenn die Zeilennummer berücksichtigt wird.
Rank(), Dense_rank(), row_number()
Dies sind alles Fensterfunktionen, dh sie fungieren zunächst als Fenster über einem geordneten Eingabesatz. Diesen Fenstern sind je nach Anforderung unterschiedliche Funktionen zugeordnet. Hier ist die obige 3:
row_number()
Ausgehend row_number()davon bildet dies die Grundlage für diese zugehörigen Fensterfunktionen. row_number()Wie der Name schon sagt, gibt der Satz von Zeilen, auf die er angewendet wurde, eine eindeutige Nummer. Ähnlich wie bei der Angabe einer Seriennummer für jede Zeile.
Rank()
Eine Subversion von row_number()kann gesagt werden als rank(). Rank () wird verwendet, um den geordneten Satzreihen, bei denen es sich um Duplikate handelt, dieselbe Seriennummer zu geben. Die Anzahl wird jedoch weiterhin als ähnlich zu a row_number()für alle nach Duplikaten gehalten. Rank () bedeutet wie von unten, z. Für Daten 2 bedeutet row_number () = rank (), dass sich beide nur in Form von Duplikaten unterscheiden.
Data row_number() rank() dense_rank()1111121113112442
Schließlich,
Dense_rank () ist eine erweiterte Version von rank (), wie der Name andeutet, denn wie Sie aus dem obigen Beispiel ersehen können, unterscheidet sich rank () = dens_rank () für alle Daten 1, aber nur für Daten 2 in der Form, in der es sich befindet behält die Reihenfolge von Rang () vom vorherigen Rang () bei, nicht die tatsächlichen Daten
Der einzige Unterschied zwischen den Funktionen RANK () und DENSE_RANK () besteht in Fällen, in denen ein „Gleichstand“ besteht. dh in Fällen, in denen mehrere Werte in einem Satz dieselbe Rangfolge haben. In solchen Fällen weist RANK () den Werten in der Menge nicht aufeinanderfolgende „Ränge“ zu (was zu Lücken zwischen den ganzzahligen Rangwerten führt, wenn ein Gleichstand besteht), während DENSE_RANK () den Werten in der Gruppe aufeinanderfolgende Ränge zuweist set (so dass es bei einem Gleichstand keine Lücken zwischen den ganzzahligen Rangwerten gibt).
Betrachten Sie beispielsweise die Menge {30, 30, 50, 75, 75, 100}. Für eine solche Menge gibt RANK () {1, 1, 3, 4, 4, 6} zurück (beachten Sie, dass die Werte 2 und 5 übersprungen werden), während DENSE_RANK () {1,1,2,3, 3,4}.
values
Klausel verwenden könnten .from dual
für die Generierung dieser Daten in RedshiftDieser Artikel hier erklärt es schön. Im Wesentlichen können Sie es als solches betrachten:
Das Obige ergibt:
In Worten
ROW_NUMBER()
weist jeder Zeile einen eindeutigen Wert zuRANK()
schreibt dem gleichen Wert dieselbe Zeilennummer zu und hinterlässt "Löcher"DENSE_RANK()
schreibt dem gleichen Wert dieselbe Zeilennummer zu und hinterlässt keine "Löcher"quelle
quelle
rank () : Wird verwendet, um einen Datensatz innerhalb einer Gruppe von Zeilen zu ordnen.
dens_rank () : Die DENSE_RANK-Funktion verhält sich wie die RANK-Funktion, weist jedoch aufeinanderfolgende Ränge zu.
Abfrage -
Ausgabe -
Abfrage -
Ausgabe -
quelle
Row_number()
-> Wird zur Generierung der Seriennummer verwendetDense_rank()
gibt einen kontinuierlichen Rang, aber der Rang überspringt den Rang im Falle eines Rangkonflikts.quelle
Der einzige Unterschied zwischen den Funktionen RANK () und DENSE_RANK () besteht in Fällen, in denen ein „Gleichstand“ besteht. dh in Fällen, in denen mehrere Werte in einem Satz dieselbe Rangfolge haben. In solchen Fällen weist RANK () den Werten in der Menge nicht aufeinanderfolgende „Ränge“ zu (was zu Lücken zwischen den ganzzahligen Rangwerten führt, wenn ein Gleichstand besteht), während DENSE_RANK () den Werten in der Gruppe aufeinanderfolgende Ränge zuweist set (so dass es bei einem Gleichstand keine Lücken zwischen den ganzzahligen Rangwerten gibt).
Betrachten Sie beispielsweise die Menge {25, 25, 50, 75, 75, 100}. Für eine solche Menge gibt RANK () {1, 1, 3, 4, 4, 6} zurück (beachten Sie, dass die Werte 2 und 5 übersprungen werden), während DENSE_RANK () {1,1,2,3, 3,4}.
quelle
Rank () Die SQL-Funktion generiert den Rang der Daten innerhalb des geordneten Wertesatzes, aber der nächste Rang nach dem vorherigen Rang ist row_number dieser bestimmten Zeile. Andererseits generiert die SQL-Funktion Dense_Rank () die nächste Nummer, anstatt row_number zu generieren. Unten finden Sie das SQL-Beispiel, das das Konzept verdeutlicht:
Es wird folgende Ausgabe generiert:
quelle
Rang und dichter Rang geben den Rang im partitionierten Datensatz an.
Rank (): Es gibt keine aufeinanderfolgenden Ganzzahlen.
Dense_rank (): Sie erhalten aufeinanderfolgende Ganzzahlen.
Im obigen Bild beträgt der Rang von 10008 zip 2 nach der Funktion dens_rank () und 24 nach der Funktion rank (), wenn die Zeilennummer berücksichtigt wird.
quelle
Rank(), Dense_rank(), row_number()
Dies sind alles Fensterfunktionen, dh sie fungieren zunächst als Fenster über einem geordneten Eingabesatz. Diesen Fenstern sind je nach Anforderung unterschiedliche Funktionen zugeordnet. Hier ist die obige 3:row_number()
Ausgehend
row_number()
davon bildet dies die Grundlage für diese zugehörigen Fensterfunktionen.row_number()
Wie der Name schon sagt, gibt der Satz von Zeilen, auf die er angewendet wurde, eine eindeutige Nummer. Ähnlich wie bei der Angabe einer Seriennummer für jede Zeile.Rank()
Eine Subversion von
row_number()
kann gesagt werden alsrank()
. Rank () wird verwendet, um den geordneten Satzreihen, bei denen es sich um Duplikate handelt, dieselbe Seriennummer zu geben. Die Anzahl wird jedoch weiterhin als ähnlich zu arow_number()
für alle nach Duplikaten gehalten. Rank () bedeutet wie von unten, z. Für Daten 2 bedeutet row_number () = rank (), dass sich beide nur in Form von Duplikaten unterscheiden.Schließlich,
Dense_rank () ist eine erweiterte Version von rank (), wie der Name andeutet, denn wie Sie aus dem obigen Beispiel ersehen können, unterscheidet sich rank () = dens_rank () für alle Daten 1, aber nur für Daten 2 in der Form, in der es sich befindet behält die Reihenfolge von Rang () vom vorherigen Rang () bei, nicht die tatsächlichen Daten
quelle
Der einzige Unterschied zwischen den Funktionen RANK () und DENSE_RANK () besteht in Fällen, in denen ein „Gleichstand“ besteht. dh in Fällen, in denen mehrere Werte in einem Satz dieselbe Rangfolge haben. In solchen Fällen weist RANK () den Werten in der Menge nicht aufeinanderfolgende „Ränge“ zu (was zu Lücken zwischen den ganzzahligen Rangwerten führt, wenn ein Gleichstand besteht), während DENSE_RANK () den Werten in der Gruppe aufeinanderfolgende Ränge zuweist set (so dass es bei einem Gleichstand keine Lücken zwischen den ganzzahligen Rangwerten gibt).
Betrachten Sie beispielsweise die Menge {30, 30, 50, 75, 75, 100}. Für eine solche Menge gibt RANK () {1, 1, 3, 4, 4, 6} zurück (beachten Sie, dass die Werte 2 und 5 übersprungen werden), während DENSE_RANK () {1,1,2,3, 3,4}.
quelle