使用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;
答案 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