Oracle SQL - 从最近三个 GRN 日期获取项目的最高 (Max) 价格 (Order By)

Posted

技术标签:

【中文标题】Oracle SQL - 从最近三个 GRN 日期获取项目的最高 (Max) 价格 (Order By)【英文标题】:Oracle SQL - Get maximum (Max) price of Item from latest three GRN dates (Order By) 【发布时间】:2021-06-27 02:38:26 【问题描述】:

在这种情况下,我有两个表,grn_item 表和 grn 表,我仅使用以下查询获取以下列。

select gi.item_no, g.grn_date, gi.price from grn_item gi
join grn g on gi.grn_no = g.grn_no 

样本数据:

ITEM NO | GRN Date  | Price
----------------------------------
IT00001 | 03-AUG-21 | 1.2
IT00001 | 01-JUN-21 | 5
IT00001 | 08-MAY-21 | 6
IT00001 | 19-MAR-21 | 7.2
IT00002 | 14-NOV-21 | 3.4
IT00002 | 08-OCT-21 | 1.7
IT00002 | 25-FEB-21 | 2.5
IT00003 | 08-MAY-21 | 4.3
IT00003 | 03-SEP-21 | 8.2
IT00003 | 15-JUL-21 | 0.4
IT00003 | 11-DEC-21 | 9.3
IT00003 | 22-SEP-21 | 10.2

我的要求有点棘手,不知道能不能实现,就是从最新的三个grn_date中得到每个item_no最高价格的。

示例:- 以下是 IT00003 的最新 grn_dates 记录。 其中,最高价格为10.2

IT00003 | 03-SEP-21 | 8.2
IT00003 | 11-DEC-21 | 9.3
IT00003 | 22-SEP-21 | 10.2

所以我的预期结果应该如下所示。 grn_date 不需要显示,但我将其包含在下面以与上面的示例数据进行比较。

ITEM NO | GRN Date  | max(Price)
----------------------------------
IT00001 | 08-MAY-21 | 6
IT00002 | 14-NOV-21 | 3.4
IT00003 | 22-SEP-21 | 10.2

我正在使用 Oracle DB,所以我使用类似的东西来获得预期。但是没有成功,可以这样做吗?

select * from (select * from (select gi.item_no, max(gi.price) 
from grn_item gi join grn g on gi.grn_no = g.grn_no 
order by g.grn_date desc) where rownum <= 3) group by gi.item_no

【问题讨论】:

您在预期输出中显示的日期似乎既不是每个项目的最早日期也不是最晚日期。请在这里解释你的逻辑。 我添加了解释,请不要关闭问题谢谢:) 【参考方案1】:

从您现有的(中间)结果开始,您可以按如下方式完成查询:

更改会话集 nls_date_format = 'dd-MON-rr';

with
  intermediate_result (item_no, grn_date, price) as (
    select 'IT00001', to_date('03-AUG-21'),  1.2 from dual union all
    select 'IT00001', to_date('01-JUN-21'),  5   from dual union all
    select 'IT00001', to_date('08-MAY-21'),  6   from dual union all
    select 'IT00001', to_date('19-MAR-21'),  7.2 from dual union all
    select 'IT00002', to_date('14-NOV-21'),  3.4 from dual union all
    select 'IT00002', to_date('08-OCT-21'),  1.7 from dual union all
    select 'IT00002', to_date('25-FEB-21'),  2.5 from dual union all
    select 'IT00003', to_date('08-MAY-21'),  4.3 from dual union all
    select 'IT00003', to_date('03-SEP-21'),  8.2 from dual union all
    select 'IT00003', to_date('15-JUL-21'),  0.4 from dual union all
    select 'IT00003', to_date('11-DEC-21'),  9.3 from dual union all
    select 'IT00003', to_date('22-SEP-21'), 10.2 from dual
  )
select item_no, max(price) as max_price_of_last_3
from   (
         select item_no, price,
                row_number() over (partition by item_no
                                   order by grn_date desc) as rn
         from   intermediate_result
       )
where  rn <= 3
group  by item_no
;

ITEM_NO MAX_PRICE_OF_LAST_3
------- -------------------
IT00001                   6
IT00002                 3.4
IT00003                10.2

这显示了这个想法,并在您的“输入”数据上对其进行了测试。

最好将此与您现有的查询结合起来,以节省一些工作。未经测试,但我认为它应该是这样的:

select item_no, max(price) as max_price_of_last_3
from   (
         select gi.item_no, gi.price,
                row_number() over (partition by gi.item_no
                                   order by g.grn_date desc) as rn
         from   grn_item gi join grn g on gi.grn_no = g.grn_no
       )
where  rn <= 3
group  by item_no
;

【讨论】:

非常感谢!正在对此进行测试,它提供了预期的结果。需要一些时间来理解,但很好的工作.. 无论如何谢谢!

以上是关于Oracle SQL - 从最近三个 GRN 日期获取项目的最高 (Max) 价格 (Order By)的主要内容,如果未能解决你的问题,请参考以下文章

基于日期的 Oracle SQL 最近行

oracle sql 最近5个季度的最后一天

尝试查找 Oracle SQL 中状态字段更改的最近日期

oracle sql变慢问题

在Oracle中选择具有最近日期和时间的记录[重复]

Spark SQL - 从 oracle 导入时将 oracle 日期数据类型错误转换为时间戳(java.sql)