DENSE_RANK ORDER BY NULL всегда возвращает 1 - PullRequest
0 голосов
/ 02 марта 2020

Я нахожу в коде процедуры PROD, например:

select *
from (select "EMPNO",
    "SAL",
    "COMM",
    "DEPTNO",
    DENSE_RANK() OVER (PARTITION BY deptno ORDER BY null) AS drank
    from SCOTT."EMP"
    where deptno in (10,30))
where drank = 1
order by deptno

РЕЗУЛЬТАТ:

EMPNO   SAL      COMM  DEPTNO   DRANK
7934    1300     -     10       1
7839    5000     -     10       1
7782    2450     -     10       1
7844    1500     0     30       1
7900    950      -     30       1
7654    1250     1400  30       1
7499    1600     300   30       1
7698    2850     -     30       1
7521    1250     500   30       1

В результате выпил всегда равно 1. Это также верно для:

DENSE_RANK () OVER (ORDER BY null) AS выпил

DENSE_RANK () OVER (PARTITION BY COMMDER BY по NULL) AS выпил

DENSE_RANK ( ) OVER (PARTITION BY 1 ORDER BY NULL) AS выпил

DENSE_RANK () OVER (PARTITION BY NULL ORDER BY NULL) AS выпил

Есть ли случаи, когда выпил не равно 1, когда есть ORDER BY null предложение?

РЕДАКТИРОВАТЬ: я знаю dens_rank начать с 1. Вопрос о значениях больше 1 .

1 Ответ

3 голосов
/ 02 марта 2020

Документация гласит:

Используйте order_by_clause, чтобы указать порядок упорядочения данных в разделе. Для всех функций analyti c вы можете упорядочить значения в разделе по нескольким клавишам, каждая из которых определяется как value_expr, а каждая определяется последовательностью упорядочения.

Внутри каждой функции, Вы можете указать несколько выражений заказа. Это особенно полезно при использовании функций, которые ранжируют значения, поскольку второе выражение может разрешать связи между одинаковыми значениями для первого выражения.

Всякий раз, когда order_by_clause приводит к одинаковым значениям для нескольких строк, функция ведет себя следующим образом:

  • CUME_DIST, DENSE_RANK, NTILE, PERCENT_RANK и RANK возвращают одинаковый результат для каждой из строк.
  • ...

Когда вы order by null, order_by_clause приводит к одинаковым значениям для , несколько все строк (в разделе), поэтому все они получают одинаковый результат.

Документация для dense_rank также гласит:

Ранги являются последовательными целыми числами, начинающимися с 1.

Таким образом, они получают тот же результат, который должен быть 1.

...