RANK дает вам рейтинг в пределах вашего заказанного раздела. Галстукам присваивается тот же ранг, а следующий ранг (ы) пропускается. Таким образом, если у вас есть 3 предмета на ранге 2, следующий перечисленный ранг получит 5 баллов.
DENSE_RANK снова дает вам рейтинг в пределах вашего заказанного раздела, но ранги являются последовательными. Ранги не пропускаются, если есть ранги с несколькими предметами.
Что касается нулей, то это зависит от предложения ORDER BY. Вот простой тестовый скрипт, с которым вы можете поиграть, чтобы увидеть, что происходит:
with q as (
select 10 deptno, 'rrr' empname, 10000.00 sal from dual union all
select 11, 'nnn', 20000.00 from dual union all
select 11, 'mmm', 5000.00 from dual union all
select 12, 'kkk', 30000 from dual union all
select 10, 'fff', 40000 from dual union all
select 10, 'ddd', 40000 from dual union all
select 10, 'bbb', 50000 from dual union all
select 10, 'xxx', null from dual union all
select 10, 'ccc', 50000 from dual)
select empname, deptno, sal
, rank() over (partition by deptno order by sal nulls first) r
, dense_rank() over (partition by deptno order by sal nulls first) dr1
, dense_rank() over (partition by deptno order by sal nulls last) dr2
from q;
EMP DEPTNO SAL R DR1 DR2
--- ---------- ---------- ---------- ---------- ----------
xxx 10 1 1 4
rrr 10 10000 2 2 1
fff 10 40000 3 3 2
ddd 10 40000 3 3 2
ccc 10 50000 5 4 3
bbb 10 50000 5 4 3
mmm 11 5000 1 1 1
nnn 11 20000 2 2 2
kkk 12 30000 1 1 1
9 rows selected.
Вот ссылка на хорошее объяснение и несколько примеров.
values
предложение.from dual
для генерации этих данных в RedshiftЭта статья здесь хорошо объясняет это. По сути, вы можете посмотреть на это так:
Выше приведут:
В словах
ROW_NUMBER()
присваивает уникальное значение каждой строкеRANK()
приписывает тот же номер строки к тому же значению, оставляя «дыры»DENSE_RANK()
приписывает тот же номер строки к тому же значению, не оставляя "дырок"источник
источник
rank () : используется для ранжирования записи в группе строк.
dens_rank () : функция DENSE_RANK действует как функция RANK, за исключением того, что она назначает последовательные ранги.
Запрос -
Вывод -
Запрос -
Вывод -
источник
Row_number()
-> Используется для генерации серийного номераDense_rank()
даст непрерывный ранг, но ранг будет пропускать ранг в случае столкновения ранга.источник
Единственная разница между функциями RANK () и DENSE_RANK () заключается в тех случаях, когда есть «связь»; то есть в случаях, когда несколько значений в наборе имеют одинаковое ранжирование. В таких случаях RANK () назначает непоследовательные «ранги» значениям в наборе (что приводит к разрывам между целочисленными значениями ранжирования при наличии связи), тогда как DENSE_RANK () назначает последовательные ранги значениям в установить (таким образом, не будет пробелов между целочисленными значениями ранжирования в случае ничьей).
Например, рассмотрим набор {25, 25, 50, 75, 75, 100}. Для такого набора RANK () вернет {1, 1, 3, 4, 4, 6} (обратите внимание, что значения 2 и 5 пропущены), тогда как DENSE_RANK () вернет {1,1,2,3, 3,4}.
источник
Функция SQL Rank () генерирует ранг данных в пределах упорядоченного набора значений, но следующим рангом после предыдущего ранга является row_number этой конкретной строки. С другой стороны, функция SQL Dense_Rank () генерирует следующее число вместо генерирования row_number. Ниже приведен пример SQL, который пояснит концепцию:
Будет сгенерирован следующий вывод:
источник
Ранг и Плотный ранг дают ранг в разделенном наборе данных.
Rank (): он не дает вам последовательных целых чисел.
Dense_rank (): он дает вам последовательные целые числа.
На приведенном выше рисунке ранг 10008 zip равен 2 с помощью функции density_rank () и 24 с помощью функции rank (), так как он рассматривает row_number.
источник
Rank(), Dense_rank(), row_number()
Все они являются оконными функциями, что означает, что они сначала действуют как окна для некоторого упорядоченного набора ввода. Эти окна имеют разные функциональные возможности, связанные с ними в зависимости от требований. Вот выше 3:row_number()
Начиная с того,
row_number()
как это составляет основу этих связанных оконных функций.row_number()
как следует из названия, дает уникальный номер для набора строк, над которым он был применен. Аналогично присвоению серийного номера каждой строке.Rank()
Подрывная деятельность
row_number()
может быть сказано какrank()
. Rank () используется для присвоения одинакового серийного номера тем строкам упорядоченного набора, которые являются дубликатами, но при этом количество сохраняемых данных остается таким же, как иrow_number()
для всех после дубликатов rank (), что означает, например, снизу, например. Для данных 2 row_number () = rank () означает, что оба просто отличаются в форме дубликатов.В заключение,
Dense_rank () - это расширенная версия rank (), поскольку название предполагает ее плотность, поскольку, как видно из приведенного выше примера, rank () = dens_rank () для всех данных 1, но только для данных 2 они отличаются в той форме, в которой они поддерживает порядок ранга () из предыдущего ранга (), а не фактических данных
источник
Единственная разница между функциями RANK () и DENSE_RANK () заключается в тех случаях, когда есть «связь»; то есть в случаях, когда несколько значений в наборе имеют одинаковое ранжирование. В таких случаях RANK () назначает непоследовательные «ранги» значениям в наборе (что приводит к разрывам между целочисленными значениями ранжирования при наличии связи), тогда как DENSE_RANK () назначает последовательные ранги значениям в установить (таким образом, не будет пробелов между целочисленными значениями ранжирования в случае ничьей).
Например, рассмотрим набор {30, 30, 50, 75, 75, 100}. Для такого набора RANK () вернет {1, 1, 3, 4, 4, 6} (обратите внимание, что значения 2 и 5 пропущены), тогда как DENSE_RANK () вернет {1,1,2,3, 3,4}.
источник