oracle的分析函数问题

时间:2018-04-25 08:18:18

标签: oracle function analytical

如果以下内容偏离主题,或者不清楚,或者过于具体或太复杂而无法理解,请告知我们。我认为以下是描述,理解和解决的挑战。

CIF =成本,保险,朋友(基本上是进口值)

输入表(Import)的简化版本如下所示:

enter image description here 因此,从1月到6月,值1分配给SixMonthPeriod列,其余月份的值为2.

然后我想计算六个时期的单价,因此我使用

select SixMonthPeriod, ProductDescrip, Sum(weight), Sum (CIF), (Sum (CIF))/(Sum(weight)) as UnitPrice
from Import
group by SixMonthPeriod, ProductDescrip;

这很好,但我想计算每个产品(超过六个月的时间段)的通货膨胀,我需要使用滞后(oracle分析功能)。必须修复六个月的期限。因此,如果缺少特定产品的前一期间,则单位价格应为零。我想重新开始/开始计算每种产品的通货膨胀。单价和通胀方程分别如下所示:

单价=(六个月内的总和(重量))/(六个月内的总和(CIF)) 通胀=(当前单价 - 前一单价)/(前一单价)

我使用以下SQL来计算每个产品的六个月期间的通货膨胀,其中每个产品的计算结果再次开始:

select Yr, SixMthPeriod, Product, UnitPrice, LagUnitPrice, ((UnitPrice -LagUnitPrice)/LagUnitPrice) as inflation
from (select Year as Yr, SixMonthPeriod as SixMthPeriod, 
ProductDescrip as product, (Sum (CIF))/(Sum(weight)) as UnitPrice, 
lag((Sum (CIF))/(Sum(weight)))
over (partition by ProductDescrip order by YEAR, SixMonthPeriod) as LagUnitPrice
From Import
group by Year, SixMonthPeriod, ProductDescrip)

问题是通胀期不固定。

例如,对于结果,我得到以下内容:

enter image description here 前两行很好,应该有空值,因为它们是我的第一行,因此没有LagUnitPrice和通货膨胀。

第三行存在一个问题,即它使用了0.34作为LagUnitPrice但实际上它是零(对于产品大麦的SixMthPeriod = 1的2016年期间)。 oracle分析函数没有考虑缺失的行(例如,对于产品大麦,SixMthPeriod = 1的2016年期间)。

如何解决这个问题(如果你理解我的话)?

我有96行,因此我可以将文件导出为ex​​cel,并使用excel的公式来修复这些异常。

1 个答案:

答案 0 :(得分:0)

您可以使用可以自由的价格自动生成缺失期间,将其附加到您的数据中并按照您的方式执行其余操作:

select product, year, smp, price, prev_price, (price - prev_price) / prev_price inflation 
  from (    
    select product, year, smp, price, 
           lag(price) over (partition by product order by year, smp) prev_price
      from ( 
        select year, ProductDescrip product, SixMonthPeriod smp, sum(CIF)/sum(weight) price
          from Import
          group by year, SixMonthPeriod, ProductDescrip) a
      full join (
        select distinct year, productdescrip product, column_value smp
          from import cross join table(sys.odcinumberlist(1, 2))) b
      using (product, year, smp))
  order by product, year, smp

<强> SQLFiddle demo

子查询b负责生成所有句点,您可以单独运行它以查看它产生的内容。