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) = 8
for 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 Oracle 查询数据,汇总数据 oracle数据查询