Агрегатная функция Dense_rank внутри группы - PullRequest
1 голос
/ 08 июля 2019

Использование Oracle 12C Эта функция относится к функции Dense_Rank в группе агрегирования, она берет два столбца (зарплата, комиссия), существующих в таблице (emp), и предоставляет ее ранг. Результаты немного сбивают с толку. Ранг отображается, даже если значения отсутствуют в базе данных. Есть две записи с 3000.

Существующие значения в дБ для

sal, comm

3000, NULL

3000,50 (обновлено одно значение связи с NULL до 50 в таблице EMP)

Несуществующие значения в дБ для

sal, comm

3000,0

3000,100

3000,500

Дает ли он возможные ранги, если да, то дает ли он тот же ранг (3) для comm 100,500 и NULL. И равный ранг (2) для комм 0 и 50.

ЗАКАЗ ПО SAL DESC И COMM ASC.

 select DENSE_rank (3000,null) within group(order by sal desc,comm ) DENSE_NULL,
        DENSE_rank (3000,0) within group(order by sal desc,comm) DENSE_ZERO,   
        DENSE_rank (3000,50) within group(order by sal desc,comm) DENSE_50,
        DENSE_rank (3000,100) within group(order by sal desc,comm) DENSE_100,
        DENSE_rank (3000,500) within group(order by sal desc,comm) DENSE_500
   from emp;

Заказ по sal desc и comm asc

Здесь 49 дается ранг

50 дается ранг

51 и NULL присваиваются звания z.


SELECT DENSE_RANK (3000,49)   WITHIN GROUP(ORDER BY sal DESC,comm) DENSE_49,   
       DENSE_RANK (3000,50)   WITHIN GROUP(ORDER BY sal DESC,comm) DENSE_50,
       DENSE_RANK (3000,51)   WITHIN GROUP(ORDER BY sal DESC,comm) DENSE_51,
       DENSE_RANK (3000,null) WITHIN GROUP(ORDER BY sal DESC,comm) DENSE_NULL
  FROM emp;

Заказ по Sal desc и comm desc

Здесь 49 дается ранг

50 и 51 дается ранг

NULL присваивается звание z.

SELECT DENSE_RANK (3000,49)   WITHIN GROUP(ORDER BY sal DESC,comm desc) DENSE_49,   
       DENSE_RANK (3000,50)   WITHIN GROUP(ORDER BY sal DESC,comm desc) DENSE_50,
       DENSE_RANK (3000,51)   WITHIN GROUP(ORDER BY sal DESC,comm desc) DENSE_51,
       DENSE_RANK (3000,null) WITHIN GROUP(ORDER BY sal DESC,comm desc) DENSE_NULL
  FROM emp;

1 Ответ

0 голосов
/ 10 июля 2019

Не следует делать вывод, что выражения присваивают один и тот же ранг, потому что каждый из ваших DENSE_RANK должен рассматриваться изолированно.Итак, 0 и 50 имеют одинаковый ранг, потому что когда сравнивается независимо с записями в таблице, они оба попадают под одинаковый ранг .

DENSE_NULL DENSE_ZERO   DENSE_50  DENSE_100  DENSE_500
---------- ---------- ---------- ---------- ----------
        63         63         63         63         63

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

with hypoth(sal,comm) AS
(
  select 330,null from dual union all
  select 3000,0   from dual union all
  select 3000,50  from dual union all
  select 3000,500 from dual
)
 select DENSE_rank (3000,null) within group(order by sal desc,comm ) DENSE_NULL,
        DENSE_rank (3000,0) within group(order by sal desc,comm) DENSE_ZERO,   
        DENSE_rank (3000,50) within group(order by sal desc,comm) DENSE_50,
        DENSE_rank (3000,100) within group(order by sal desc,comm) DENSE_100,
        DENSE_rank (3000,500) within group(order by sal desc,comm) DENSE_500
   from ( select  salary as sal,commission_pct as comm from  employees 
          UNION ALL
          select sal,comm  from  hypoth
          );

, что дает

DENSE_NULL DENSE_ZERO   DENSE_50  DENSE_100  DENSE_500
---------- ---------- ---------- ---------- ----------
        66         63         64         65         65
...