在Oracle SQL(Oracle 11g)中按分区排序
我在一个表中有4列在Oracle SQL(Oracle 11g)中按分区排序,sql,oracle,greatest-n-per-group,window-functions,Sql,Oracle,Greatest N Per Group,Window Functions,我在一个表中有4列 公司零件号 制造商零件号 订单号 零件接收日期 前 我只想根据表中第一行的最大零件接收日期返回一条记录(零件接收日期为2015年3月31日的记录) 我试过了 RANK() OVER (PARTITION BY Company Part Number,Manufacturer Part Number ORDER BY Part Receipt Date DESC,Order Number DESC) = 1 在WHERE语句的末尾,这不
- 公司零件号
- 制造商零件号
- 订单号
- 零件接收日期 前
RANK() OVER (PARTITION BY Company Part Number,Manufacturer Part Number
ORDER BY Part Receipt Date DESC,Order Number DESC) = 1
在WHERE语句的末尾,这不起作用。这似乎可以满足您的要求:
select t.*
from (select t.*
from t
order by partreceiptdate desc
) t
where rownum = 1;
像
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
另外请注意,您不能有像
公司零件号
这样的列名(其中有空格)-至少不能,除非它们用双引号括起来,这是一种非常糟糕的做法,最好避免。OP按公司零件号
和制造商零件号
进行分区,你注意到了吗?@mathguy。我认为阅读这个问题是非常清楚的:“我只想返回一条基于最大零件接收日期的记录,这将是表中的第一行”。窗口功能对于这个操作来说是多余的。所以你不会觉得OP显示了一个简化的输入,而事实上他有几个不同的公司零件号和制造商零件号,他正试图获得最近的零件交付?真的吗?@mathguy。OP可以自由评论和详细说明任何答案(或评论)。这是他/她提出的具体问题的最简单解决方案。我看没有理由使它复杂化。我当然不会假定问题中没有的东西,然后根据这个问题否决其他用户。谢谢你们的帮助。这起作用了。还有一个问题。出于报告原因,我只需从部件接收日期列中单独返回dd/mm/yyyy,忽略时间部件。你能帮我吗?谢谢你们的帮助。这起作用了。还有一个问题。出于报告原因,我只需从部件接收日期列中单独返回dd/mm/yyyy,忽略时间部件。你能帮我一下吗?@Jude92-不要在选择中包含零件收据日期
,而是包含到字符(零件收据日期,'dd/mm/yyyy')
。不过,只在最终报告中这样做,而不是任何中间结果。嘿,裘德,如果他们中的一个帮助你解决了你的问题,在这里看到一个明显的答案会很好。