时间:2019-07-08 16:49:59

标签: sql oracle oracle12c

使用Oracle 12C 关于组聚合内的Dense_Rank函数,该函数采用(emp)表中存在的两列(薪水,佣金)并提供其排名。结果有点混乱。即使值不在数据库中,也会显示排名。有两条记录是3000。

中db中的现有值

工资,通讯

3000,空

3000,50(将EMP表中的comm值之一从NULL更新为50)

db中不存在的值

工资,通讯

3000,0

3000,100

3000,500

是否给出可能的等级,如果是,则给出 comm 100,500和NULL的相同等级(3)。 通讯0和50等于等级(2)。

通过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个x等级

50被授予y排名

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个x等级

50和51被赋予y排名

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 :(得分:0)

不能因为表达式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