RANK vous donne le classement dans votre partition ordonnée. Les égalités sont attribuées au même rang, le (s) classement (s) suivant (s) étant ignoré (s). Donc, si vous avez 3 éléments au rang 2, le rang suivant sera classé 5.
DENSE_RANK vous donne à nouveau le classement dans votre partition ordonnée, mais les rangs sont consécutifs. Aucun classement n'est ignoré s'il existe des rangs avec plusieurs éléments.
Quant aux valeurs nulles, cela dépend de la clause ORDER BY. Voici un script de test simple avec lequel vous pouvez jouer pour voir ce qui se passe:
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.
Voici un lien vers une bonne explication et quelques exemples.
très bonne idée d'utiliser select union all from dual pour générer des exemples de données sans créer de table
Jean-Christophe Blanchard
@ Jean-ChristopheBlanchard bien que vous puissiez tout aussi bien utiliser une valuesclause.
Wildcard
1
@Wildcard Dans PG, oui. Dans Oracle, non . Du moins pas à partir de 11. Je n'ai pas encore rencontré 12 en prod.
jpmc26
Supprimer from dualpour générer ces données dans Redshift
Gaurav
4
Ivan, RANK me donne une idée où je suis par rapport à tous ceux qui m'attendent. DENSE_RANK me donne le rang absolu. J'ai peut-être le deuxième salaire le plus élevé, mais il pourrait y avoir 100 personnes devant moi. Lequel est le meilleur dépend de la question à laquelle je réponds.
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;
Ce qui précède donnera:
+---+------------+------+------------+| 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|+---+------------+------+------------+
Dans les mots
ROW_NUMBER() attribue une valeur unique à chaque ligne
RANK() attribue le même numéro de ligne à la même valeur, laissant des "trous"
DENSE_RANK() attribue le même numéro de ligne à la même valeur, sans laisser de "trous"
rank () : il est utilisé pour classer un enregistrement dans un groupe de lignes.
dense_rank () : La fonction DENSE_RANK agit comme la fonction RANK sauf qu'elle attribue des rangs consécutifs.
Requete -
select
ENAME,SAL,RANK()over(orderby SAL) RANK
from
EMP;
Production -
+--------+------+------+| ENAME | SAL | RANK |+--------+------+------+| SMITH |800|1|| JAMES |950|2|| ADAMS |1100|3|| MARTIN |1250|4|| WARD |1250|4|| TURNER |1500|6|+--------+------+------+
Requete -
select
ENAME,SAL,dense_rank()over(orderby SAL) DEN_RANK
from
EMP;
Production -
+--------+------+-----------+| ENAME | SAL | DEN_RANK |+--------+------+-----------+| SMITH |800|1|| JAMES |950|2|| ADAMS |1100|3|| MARTIN |1250|4|| WARD |1250|4|| TURNER |1500|5|+--------+------+-----------+
La seule différence entre les fonctions RANK () et DENSE_RANK () est dans les cas où il y a une «égalité»; c'est-à-dire dans les cas où plusieurs valeurs dans un ensemble ont le même classement. Dans de tels cas, RANK () attribuera des «rangs» non consécutifs aux valeurs de l'ensemble (ce qui entraînera des écarts entre les valeurs de classement entier en cas d'égalité), tandis que DENSE_RANK () attribuera des rangs consécutifs aux valeurs du set (il n'y aura donc aucun écart entre les valeurs de classement entier en cas d'égalité).
Par exemple, considérons l'ensemble {25, 25, 50, 75, 75, 100}. Pour un tel ensemble, RANK () retournera {1, 1, 3, 4, 4, 6} (notez que les valeurs 2 et 5 sont ignorées), alors que DENSE_RANK () retournera {1,1,2,3, 3,4}.
La fonction SQL Rank () génère le rang des données dans un ensemble ordonné de valeurs, mais le rang suivant après le rang précédent est row_number de cette ligne particulière. D'autre part, la fonction SQL Dense_Rank () génère le numéro suivant au lieu de générer row_number. Voici l'exemple SQL qui clarifiera le concept:
Rank(), Dense_rank(), row_number()
Ce sont toutes des fonctions de fenêtre, ce qui signifie qu'elles agissent comme une fenêtre sur un ensemble d'entrées ordonnées au début. Ces fenêtres ont différentes fonctionnalités attachées en fonction de l'exigence. Voici les 3 ci-dessus:
row_number()
En commençant par row_number()car cela constitue la base de ces fonctions de fenêtre associées. row_number()comme son nom l'indique, donne un numéro unique à l'ensemble de lignes sur lequel il a été appliqué. Similaire à donner un numéro de série à chaque ligne.
Rank()
Une subversion de row_number()peut être dite comme rank(). Rank () est utilisé pour donner le même numéro de série à ces lignes d'ensemble ordonnées qui sont des doublons, mais il garde toujours le compte maintenu comme similaire à a row_number()pour tous ceux après les doublons. Pour les données 2 row_number () = rank () signifiant que les deux diffèrent simplement sous la forme de doublons.
Data row_number() rank() dense_rank()1111121113112442
Finalement,
Dense_rank () est une version étendue de rank () comme son nom l'indique, c'est dense parce que comme vous pouvez le voir dans l'exemple ci-dessus rank () = dense_rank () pour toutes les données 1 mais juste que pour les données 2, il diffère sous la forme conserve l'ordre de rang () à partir du rang précédent () et non les données réelles
La seule différence entre les fonctions RANK () et DENSE_RANK () est dans les cas où il y a une «égalité»; c'est-à-dire dans les cas où plusieurs valeurs dans un ensemble ont le même classement. Dans de tels cas, RANK () attribuera des «rangs» non consécutifs aux valeurs de l'ensemble (ce qui entraînera des écarts entre les valeurs de classement entier en cas d'égalité), tandis que DENSE_RANK () attribuera des rangs consécutifs aux valeurs du set (il n'y aura donc aucun écart entre les valeurs de classement entier en cas d'égalité).
Par exemple, considérons l'ensemble {30, 30, 50, 75, 75, 100}. Pour un tel ensemble, RANK () retournera {1, 1, 3, 4, 4, 6} (notez que les valeurs 2 et 5 sont ignorées), alors que DENSE_RANK () retournera {1,1,2,3, 3,4}.
values
clause.from dual
pour générer ces données dans RedshiftCet article ici l'explique bien. Essentiellement, vous pouvez le regarder comme tel:
Ce qui précède donnera:
Dans les mots
ROW_NUMBER()
attribue une valeur unique à chaque ligneRANK()
attribue le même numéro de ligne à la même valeur, laissant des "trous"DENSE_RANK()
attribue le même numéro de ligne à la même valeur, sans laisser de "trous"la source
la source
rank () : il est utilisé pour classer un enregistrement dans un groupe de lignes.
dense_rank () : La fonction DENSE_RANK agit comme la fonction RANK sauf qu'elle attribue des rangs consécutifs.
Requete -
Production -
Requete -
Production -
la source
Row_number()
-> Utilisé pour générer le numéro de sérieDense_rank()
donnera un rang continu mais le rang sautera le rang en cas de conflit de rang.la source
La seule différence entre les fonctions RANK () et DENSE_RANK () est dans les cas où il y a une «égalité»; c'est-à-dire dans les cas où plusieurs valeurs dans un ensemble ont le même classement. Dans de tels cas, RANK () attribuera des «rangs» non consécutifs aux valeurs de l'ensemble (ce qui entraînera des écarts entre les valeurs de classement entier en cas d'égalité), tandis que DENSE_RANK () attribuera des rangs consécutifs aux valeurs du set (il n'y aura donc aucun écart entre les valeurs de classement entier en cas d'égalité).
Par exemple, considérons l'ensemble {25, 25, 50, 75, 75, 100}. Pour un tel ensemble, RANK () retournera {1, 1, 3, 4, 4, 6} (notez que les valeurs 2 et 5 sont ignorées), alors que DENSE_RANK () retournera {1,1,2,3, 3,4}.
la source
La fonction SQL Rank () génère le rang des données dans un ensemble ordonné de valeurs, mais le rang suivant après le rang précédent est row_number de cette ligne particulière. D'autre part, la fonction SQL Dense_Rank () génère le numéro suivant au lieu de générer row_number. Voici l'exemple SQL qui clarifiera le concept:
Il générera la sortie suivante:
la source
Rank and Dense rank donne le rang dans l'ensemble de données partitionné.
Rank (): Il ne vous donne pas de nombres entiers consécutifs.
Dense_rank (): Il vous donne des nombres entiers consécutifs.
Dans l'image ci-dessus, le rang de 10008 zip est 2 par la fonction dense_rank () et 24 par la fonction rank () car il considère le row_number.
la source
Rank(), Dense_rank(), row_number()
Ce sont toutes des fonctions de fenêtre, ce qui signifie qu'elles agissent comme une fenêtre sur un ensemble d'entrées ordonnées au début. Ces fenêtres ont différentes fonctionnalités attachées en fonction de l'exigence. Voici les 3 ci-dessus:row_number()
En commençant par
row_number()
car cela constitue la base de ces fonctions de fenêtre associées.row_number()
comme son nom l'indique, donne un numéro unique à l'ensemble de lignes sur lequel il a été appliqué. Similaire à donner un numéro de série à chaque ligne.Rank()
Une subversion de
row_number()
peut être dite commerank()
. Rank () est utilisé pour donner le même numéro de série à ces lignes d'ensemble ordonnées qui sont des doublons, mais il garde toujours le compte maintenu comme similaire à arow_number()
pour tous ceux après les doublons. Pour les données 2 row_number () = rank () signifiant que les deux diffèrent simplement sous la forme de doublons.Finalement,
Dense_rank () est une version étendue de rank () comme son nom l'indique, c'est dense parce que comme vous pouvez le voir dans l'exemple ci-dessus rank () = dense_rank () pour toutes les données 1 mais juste que pour les données 2, il diffère sous la forme conserve l'ordre de rang () à partir du rang précédent () et non les données réelles
la source
La seule différence entre les fonctions RANK () et DENSE_RANK () est dans les cas où il y a une «égalité»; c'est-à-dire dans les cas où plusieurs valeurs dans un ensemble ont le même classement. Dans de tels cas, RANK () attribuera des «rangs» non consécutifs aux valeurs de l'ensemble (ce qui entraînera des écarts entre les valeurs de classement entier en cas d'égalité), tandis que DENSE_RANK () attribuera des rangs consécutifs aux valeurs du set (il n'y aura donc aucun écart entre les valeurs de classement entier en cas d'égalité).
Par exemple, considérons l'ensemble {30, 30, 50, 75, 75, 100}. Pour un tel ensemble, RANK () retournera {1, 1, 3, 4, 4, 6} (notez que les valeurs 2 et 5 sont ignorées), alors que DENSE_RANK () retournera {1,1,2,3, 3,4}.
la source