在Oracle SQL(Oracle 11g)中的Rank Over Partition By

4

我有一张表格,其中有四列:

  • 公司零件号

  • 制造商零件号

  • 订单编号

  • 零件收货日期

    例如:

enter image description here

我想根据最大的零件收货日期返回一条记录,也就是表格中第一行(零件收货日期为03/31/2015的那一行)。

我尝试过:

RANK() OVER (PARTITION BY Company Part Number,Manufacturer Part Number 
            ORDER BY Part Receipt Date DESC,Order Number DESC) = 1

在WHERE语句的末尾添加此内容并未生效。

嘿,朱迪,如果其中一个答案帮助你解决了问题,那么能看到一个标记的答案会很棒。 - RyanfaeScotland
2个回答

4
这似乎可以做到您想要的:

select t.*
from (select t.*
      from t
      order by partreceiptdate desc
     ) t
where rownum = 1;

OP在尝试中按company_part_numbermanufacturer_part_number进行了分区,你有注意到吗? - user5683823
难道你没有意识到OP展示的是一个简化的输入,实际上他有多个不同的公司零件号和制造商零件号,他正在尝试获取最近的零件交付吗?认真点好吗? - user5683823
一个新手在这个网站上呆了三个月,给出的典型回答。从你这里来说还是有点令人惊讶的。不管怎样。 - user5683823
2
非常感谢大家的帮助,这个方法很有效。不过我还有一个问题。出于报告的原因,我需要从“Part Receipt Date”列中仅返回dd/mm/yyyy日期部分,忽略时间部分。你能帮我解决吗? - Jude92
@Jude92 . . . 要获取日期,可以使用 trunc()。要以特定的格式格式化日期,可以使用 to_char() - Gordon Linoff
显示剩余2条评论

3

类似 rank() 的分析函数可以在 SELECT 子句中使用,但不能直接在 WHERE 子句中调用。如果要按照您的意愿使用 rank(),则必须在子查询中声明它,然后在外部查询的 WHERE 子句中使用它。像这样:

select company_part_number, manufacturer_part_number, order_number, part_receipt_date
from   ( select t.*, rank() over (partition by...  order by...) as rnk
         from   your_table t
       )
where  rnk = 1

请注意,您不能使用带有空格的列名,例如company part number(除非它们被双引号括起来),这是一种很差的做法,最好避免使用。

非常感谢大家的帮助,这个方法很有效。不过我还有一个问题。出于报告的原因,我需要从“Part Receipt Date”列中仅返回dd/mm/yyyy日期部分,忽略时间部分。你能帮我解决吗? - Jude92
@Jude92 - 不要在select中包含part_receipt_date,而是包含to_char(part_receipt_date, 'dd/mm/yyyy')。但只针对最终报告这样做,不要在任何中间结果中这样做。 - user5683823

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接