显示 emp 中的员工列表并按 deptno 排序,其中 null deptno 应首先出现,然后应出现 deptno=2 的课程并按升序排列。
我尝试使用 DECODE 进行以下查询,
SELECT empno, ename, deptno
FROM emp
ORDER BY DECODE (deptno, NULL, 0, 2, 1, 3);
但是,我无法通过分析功能来实现它。
有人请帮助我使用分析函数解决这个问题!
只是为了记录,用 CASE 替换 DECODE(对我来说更容易阅读)。恕我直言,要获得“按升序排列的其余部分”,您需要将 deptno 添加到 ELSE:
SELECT empno, ename, deptno,
row_number()
over (ORDER BY case when deptno is NULL then -1
when deptno = 2 then 0
else deptno
end) as seqnum
FROM emp ;
甚至 RANK() 或 DENSE_RANK() 都可以用作分析函数,ORDER BY 子句应该包含另一个venue_id 来对 DECODE 的 else 选项进行排序。
SELECT course_id, course_title,venue_id FROM ha_courses ORDER BY ROW_NUMBER () OVER (ORDER BY DECODE (venue_id, NULL, 0, 2, 1, 3)),venue_id;
我假设您要row_number()
根据排序进行分配,因为分析函数不会“排序”表。你试过这个吗?
SELECT empno, ename, deptno,
row_number() over (ORDER BY DECODE (deptno, NULL, 0, 2, 1, 3) as seqnum
FROM emp ;
您也可以完全不使用分析函数来执行此操作:
select e.*, rownum as seqnum
from (SELECT empno, ename, deptno
FROM emp
ORDER BY DECODE (deptno, NULL, 0, 2, 1, 3)
) e