【问题标题】:How do I order rows after using "Fetch First" in Oracle SQL?在 Oracle SQL 中使用“Fetch First”后如何对行进行排序?
【发布时间】:2020-11-24 18:30:05
【问题描述】:

我有一个 Oracle SQL 查询,它使用 FETCH FIRST 在 PeopleSoft 数据库中查找年薪最高的员工。

SELECT A.EMPLID, A.ANNUAL_RT
FROM PS_EMPLOYEES A
ORDER BY A.ANNUAL_RT DESC
FETCH FIRST ROW WITH TIES;
EMPLID   ANNUAL_RT
20218    100000
10300    100000
26992    100000
17864    100000

我想按 EMPLID 对结果进行排序。但是,由于我使用的是FETCH FIRST 1 ROW WITH TIES,因此将EMPLID 添加到我的ORDER BY 子句会将我的结果限制为ID 号​​最低的1 位员工。

SELECT A.EMPLID, A.ANNUAL_RT
FROM PS_EMPLOYEES A
ORDER BY A.ANNUAL_RT DESC, A.EMPLID ASC
FETCH FIRST 1 ROW WITH TIES;
EMPLID   ANNUAL_RT
10300    100000

我怎样才能对我的结果进行排序而不影响FETCH FIRST返回的行?

EMPLID   ANNUAL_RT
10300    100000
17864    100000
20218    100000
26992    100000

【问题讨论】:

    标签: sql oracle oracle12c sql-fetch


    【解决方案1】:

    将您的查询作为一个表表达式括起来(一个通用的表表达式也可以)。这样您就可以对其进行后期处理。

    例如:

    select *
    from (
      SELECT A.EMPLID, A.ANNUAL_RT
      FROM PS_EMPLOYEES A
      ORDER BY A.ANNUAL_RT DESC
      FETCH FIRST 1 ROW WITH TIES
    ) x
    order by emplid;
    

    【讨论】:

      【解决方案2】:

      您可以使用RANK()DENSE_RANK() 代替FETCH FIRST

      SELECT EMPLID, ANNUAL_RT
      FROM (
        SELECT
          A.EMPLID,
          A.ANNUAL_RT,
          RANK() OVER (ORDER BY A.ANNUAL_RT DESC) AS RANK_NO
        FROM PS_EMPLOYEES A
      )
      WHERE RANK_NO = 1
      ORDER BY EMPLID;
      

      结果:

      EMPLID   ANNUAL_RT
      10300    100000
      17864    100000
      20218    100000
      26992    100000
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-06-18
        • 2022-01-07
        • 2020-07-08
        • 1970-01-01
        • 2015-07-20
        • 2019-02-17
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多