如果以下内容偏离主题,或者不清楚,或者过于具体或太复杂而无法理解,请告知我们。我认为以下是描述,理解和解决的挑战。
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行,因此我可以将文件导出为excel,并使用excel的公式来修复这些异常。
答案 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
负责生成所有句点,您可以单独运行它以查看它产生的内容。