首页 > 解决方案 > oracle的解析函数问题

问题描述

请让我知道以下内容是否偏离主题、不清楚、太具体或太复杂而无法理解。我认为以下是描述、理解和解决的挑战。

CIF=cost, insurance, frieght(基本上就是进口价值)

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

在此处输入图像描述 因此,从一月到六月,值 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)

问题是通货膨胀期不固定。

例如,对于结果,我得到以下信息:

在此处输入图像描述 前两行很好,应该有空值,因为它们是我的第一行,因此没有 LagUnitPrice 和通货膨胀。

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

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

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

标签: oraclefunctionanalytical

解决方案


您可以使用可为空的价格自动生成缺失的期间,将它们附加到您的数据中,然后像您一样完成其余的工作:

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 演示

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


推荐阅读