0

显示 emp 中的员工列表并按 deptno 排序,其中 null deptno 应首先出现,然后应出现 deptno=2 的课程并按升序排列。

我尝试使用 DECODE 进行以下查询,

SELECT   empno, ename, deptno
    FROM emp
ORDER BY DECODE (deptno, NULL, 0, 2, 1, 3);

但是,我无法通过分析功能来实现它。

有人请帮助我使用分析函数解决这个问题!

4

3 回答 3

0

只是为了记录,用 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 ;
于 2013-08-30T14:22:41.357 回答
0

甚至 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;

于 2013-09-02T11:15:03.487 回答
0

我假设您要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
于 2013-08-30T14:00:37.093 回答