【问题标题】:Custom ordering using Analytical Functions使用分析函数自定义排序
【发布时间】:2013-09-02 19:15:03
【问题描述】:

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

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

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

但是,我无法通过解析函数来实现。

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

【问题讨论】:

    标签: sql oracle oracle11g oracle10g


    【解决方案1】:

    我假设您要根据排序分配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
    

    【讨论】:

      【解决方案2】:

      只是为了记录,将 DECODE 替换为 CASE(对我来说更容易阅读)。 恕我直言,要获得“按升序排列的其余部分”,您需要将 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 ;
      

      【讨论】:

        【解决方案3】:

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

        选择 course_id、course_title、venue_id 来自 ha_courses ORDER BY ROW_NUMBER () OVER (ORDER BY DECODE (venue_id, NULL, 0, 2, 1, 3)), 场地_id;

        【讨论】:

          猜你喜欢
          • 2018-10-09
          • 2021-08-04
          • 2021-08-04
          • 1970-01-01
          • 2010-10-31
          • 2011-09-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多