【问题标题】:getting other rank value than 1 in oracle in SQL query在 SQL 查询中在 oracle 中获取除 1 以外的其他排名值
【发布时间】:2022-07-30 22:38:59
【问题描述】:

当我像下面这样使用时,有 1 个 SQL 查询-

select * from
(select a.id, a.nm, b.pd, b.date, rank() over(partition by a.id order by b.date desc) rnk 
 from tab1 a, tab2 b where a.id = b.id) 
where rnk =1 

然后得到如下输出-

id    nm    pd    date         rnk
--    ---   ---   ----------   ---
11    abc   a15   11/04/2022    1
11    abc   a15   11/04/2022    1
14    gef   a23   11/04/2022    1
14    gef   a23   10/04/2022    12
19    lfb   a37   11/04/2022    1
19    lfb   a37   08/04/2022    21

但我只想选择一个值作为最晚日期的订单。您能否帮我解决这个问题,以便为 1 id 选择一个值,如下所示-

id    nm    pd    date         rnk
--    ---   ---   ----------   ---
11    abc   a15   11/04/2022    1
14    gef   a23   11/04/2022    1
19    lfb   a37   11/04/2022    1

【问题讨论】:

  • 对于具有最新日期的单行,尝试 row_number() over(....) 而不是 rank()...
  • @SOS 我也使用了 row_number() 但没有得到预期的输出。
  • 实际结果如何,与您的预期有何不同?

标签: sql oracle rank


【解决方案1】:

您需要按RANK() 的顺序指定第二列,这样就不会有重复的值对(例如b.id)。我还标准化了JOIN 操作。

select * from
  (select 
     a.id, 
     a.nm, 
     b.pd, 
     b.date, 
     rank() over (
        partition by a.id 
        order by b.[date] desc, b.id asc
        ) as rnk 
  from tab1 a
  join tab2 b on a.id = b.id
  ) s
where rnk = 1; 

【讨论】:

  • 感谢您的回答,但不幸的是 SQL 语法错误显示为missing right paranthesis
  • 我稍作修改请重试。如果它仍然不起作用,请提供表定义和一些示例数据,最好作为小提琴。见dbfiddle.uk/…
  • 我在 , 以及 rank() 函数中使用过,但得到的输出与我之前得到的相同,不像预期的那样。
【解决方案2】:

您是否尝试过这样的尝试,因为有时rank() 函数在主 SQL 之外不起作用。试试吧,希望它会奏效。

SELECT id,
       nm,
       pd, date
FROM
  (SELECT *
   FROM
     (SELECT a.id,
             a.nm,
             b.pd,
             b.date ,
             rank() over(PARTITION BY a.id
                         ORDER BY b.date DESC) rnk
      FROM tab1 a,
           tab2 b
      WHERE a.id = b.id))
WHERE rnk =1

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-03
    • 1970-01-01
    相关资源
    最近更新 更多