oracle - 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 的公式来修复这些异常。
解决方案
您可以使用可为空的价格自动生成缺失的期间,将它们附加到您的数据中,然后像您一样完成其余的工作:
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
子查询b
负责生成所有期间,您可以单独运行它以查看它产生的内容。
推荐阅读
- python-3.x - 以某种方式将列表中的每个元素相乘 - 每个元素与下一个元素相乘并将值存储在表中
- c - 范围内的基本 C rand 输出相同的数字
- javascript - 用于求解类似于 Mathway.com 或 Symbolab.com 的代数表达式的节点包?
- java - 如何从 GoDaddy SSL 证书创建 Java JKS 文件
- linux - 如何替换括号之间的换行符
- javascript - 如何通过点击事件向输入框添加文本?
- laravel - 如何在 Redis pub/sub 上运行 phpunit 测试?
- java - RestTemplate 结果无法反序列化
- python - validate_on_submit() 在 Flask 中不起作用。我应该怎么办?
- kubernetes - 将日志文件写入慢速磁盘或将 Tomcat 访问日志发送到 ElasticSearch?