使用分析功能定制订购

时间:2013-08-30 13:53:33

标签: sql oracle oracle11g oracle10g

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

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

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

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

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

3 个答案:

答案 0 :(得分:0)

我假设您要根据排序分配row_number(),因为分析函数没有" order"表。你试过这个吗?

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

答案 1 :(得分:0)

仅为记录,用CASE替换DECODE(对我来说更容易阅读)。 并且imho要按照升序“休息”,你需要将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 ;

答案 2 :(得分:0)

甚至RANK()或DENSE_RANK()也可用作分析函数, ORDER BY子句应该包含另一个venue_id来对DECODE的else选项进行排序。

SELECT course_id,course_title,venue_id     来自ha_courses ORDER BY ROW_NUMBER()OVER(按DECODE排序(venue_id,NULL,0,2,1,3)),          venue_id;