Oracle Query 按年汇总数量 - 仅过去 3 年

Posted

技术标签:

【中文标题】Oracle Query 按年汇总数量 - 仅过去 3 年【英文标题】:Oracle Query to rollup QTY by Year- only last 3 years 【发布时间】:2017-10-19 15:43:10 【问题描述】:

我需要从除以 YEAR 的数量的总和中找出 MAX VALUE(需要编写 Oracle 查询)。

举例

 ITEM_ID     ORG_ID     YEAR    QTY

  100         121        2015    10
  100         121        2016    5
  100         121        2017    8
  101         146        2014    10
  101         146        2015    11
  101         146        2016    12
  101         146        2017    13

我的输出应该是这样的:-

for Item_id 100,121 the max_avg should be max(10+5+8/3, 5+10/2, 10/1)... max (7.6, 7.5, 8) = 8for Item_id 101,146 the max_avg should be (11+12+13/3, 12+13/2, 13/1)... max(11.5, 12, 12.5, 13) = 13... I should not consider 10+11+12+13/4。我只需要考虑过去 3 年汇总的 AVG 并分配最大值

 ITEM_ID     ORG_ID     YEAR    QTY   MAX_AVG

  100         121        2015    10   8
  100         121        2016    5    8
  100         121        2017    8    8
  101         146        2014    10   13
  101         146        2015    11   13
  101         146        2016    12   13
  101         146        2017    13   13

任何帮助将不胜感激。

【问题讨论】:

这是想要的输出吗? ID 101,2016 年如何在新列中分配值 13?如果这不是所需的输出,请编辑以显示(正确的)所需输出。特别是对于 ID 101(例如),当没有三年要考虑时,应该为 2014 年和 2015 年显示什么?也许 2014 年只显示数量 (10),而 2015 年则显示 11/1 和 (10+11)/2 的最大值?如果没有,还有什么? 另外:select * from v$version 报告的您的 Oracle 版本是什么? @mathguy - 版本是 Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production @mathguy - 是的,这就是所需的输出。从当年和前 2 年开始,总要考虑三年。 在这种情况下,如果 ITEM_ID = 102,ORG_ID = 200(当前未在您的示例数据中显示),您的 QTY 仅适用于 2017 年,或者仅适用于 2016 年和 2017 年,您会怎么做?另外:对于 ITEM_ID 和 ORG_ID 的组合,您是否有可能只有 2014 年、2015 年和 2016 年的数据,而不是 2017 年的数据?如果是这样,在计算中使用什么数据? 【参考方案1】:

一种方法使用两个层次的分析函数:

select t.*, max(running_avg_3) over (partition by item_id)
from (select t.*,
             avg(qty) over (partition by item_id order by year desc
                            rows between current row and 2 following
                           ) as running_avg_3
      from t
     ) t

【讨论】:

这不是 OP 想要的。在“分区”中,他仅查看 2017、2017 和 2016 年以及 2017、2016 和 2015 年的平均值。这个“三个平均值中最大的一个”用于所有年份,包括 2011 年、2012 年和 2013 年。没有解释原帖里说的很清楚,评论里说清楚了。 @ Gordon - 我认为这个查询会起作用。但它仍然无法正常工作,而且它还在计算 2014 年。 @贝克汉姆。 . . windowing 子句需要朝另一个方向发展——2 个在后面而不是 2 个在前面。【参考方案2】:
select item_id, org_id, yr, qty,
       greatest (
 avg(case when yr = 2017                then qty end) over (partition by item_id, org_id),
 avg(case when yr in (2016, 2017)       then qty end) over (partition by item_id, org_id),
 avg(case when yr in (2015, 2016, 2017) then qty end) over (partition by item_id, org_id)
       ) as max_avg
from   inputs_table
;

【讨论】:

这行得通。我已将查询更改为更加动态。 :) select item_id, org_id, yr, qty, greatest ( avg(case when yr = (select to_char(sysdate, 'YYYY') from dual) then qty end) over (partition by item_id, org_id), avg(case when yr >= (select to_char(sysdate, 'YYYY')-1 from dual) then qty end) over (partition by item_id, org_id), avg(case when yr >= (select to_char(sysdate, 'YYYY')-2 from dual) then qty end) over (partition by item_id, org_id) ) as max_avg from inputs_table ;

以上是关于Oracle Query 按年汇总数量 - 仅过去 3 年的主要内容,如果未能解决你的问题,请参考以下文章

仅获取上周和过去上周的最新数据并汇总某些列

sql 按年了解订单数量

sql 按月和按年收到的产品订单数量

SQL Oracle 查询数据,汇总数据 oracle数据查询

如何在oracle sql developer中按年和月分组获取当前财政年度的数据?

oracle 11g 分区表创建(自动按年分区)