Oracle 如何根据日期计算两个条目之间的差异?
我有一个Oracle DB视图,如:Oracle 如何根据日期计算两个条目之间的差异?,oracle,date,difference,Oracle,Date,Difference,我有一个Oracle DB视图,如: DATE | PRODUCT_NUMBER | PRODUCT_COUNT | PRODUCT_FACTOR 2018-01-01 | 1 | 10 | 3 2018-03-15 | 1 | 8 | 3 2019-02-11 | 1 | 11 | 3 2019-08-01 | 1
DATE | PRODUCT_NUMBER | PRODUCT_COUNT | PRODUCT_FACTOR
2018-01-01 | 1 | 10 | 3
2018-03-15 | 1 | 8 | 3
2019-02-11 | 1 | 11 | 3
2019-08-01 | 1 | 5 | 3
2019-08-01 | 2 | 20 | 5
2019-08-02 | 2 | 15 | 5
2019-06-01 | 2 | 5 | 5
2020-07-01 | 2 | 30 | 5
2018-07-07 | 3 | 100 | 2
在哪里,
日期就是日期
编号是唯一的产品编号
COUNT是存储设施中产品编号中的项目数
系数是适合存放在货架上的产品数量
我现在需要知道自上次更新以来,每个产品编号的变化有多大。
因为第一个条目没有可比较的过去日期,所以更改是未定义的,类似于NULL、NONE、0等等。没关系,只要我以后能过滤掉
有些产品只有一个条目,应该忽略这些条目,不计算差异
最终结果应该是:
DATE | PRODUCT_NUMBER | PRODUCT_COUNT | PRODUCT_FACTOR | PRODUCT_CHANGE | CHANGE_FACTOR
2018-01-01 | 1 | 10 | 3 | NULL | NULL
2018-03-15 | 1 | 8 | 3 | 2 # 10-8 | 6 # 2*3
2019-02-11 | 1 | 11 | 3 | -3 # 8-11 | -9 # 3*-3
2019-08-01 | 1 | 5 | 3 | 6 # 11-5 | 18 # 6*3
2019-08-01 | 2 | 20 | 5 | -15 # 5-20 | -75 # -15*5
2019-08-02 | 2 | 15 | 5 | 5 # 20-15 | 25 # 5*5
2019-06-01 | 2 | 5 | 5 | NULL | NULL
2020-07-01 | 2 | 30 | 5 | -15 # 15-30 | -75 # -15*5
如何在Oracle SQL中实现这一点?最终结果有点不清楚: 为什么要比较产品编号2的15和5的值-2019-06-01小于2019-08-01,应该是第一行 为什么第一行产品1的变更系数为3,而产品2的变更系数为空 为什么2019-02-11的变化系数计算为11*0而不是0*3 假设所有这些都是2019-06-01至2019-09-01的类型变更,您可以使用以下内容
select dt, product_number, product_count, product_factor, product_change, product_change*product_factor change_factor
from (
select "DATE" dt, product_number, product_count, product_factor,
greatest(lag(product_count) over(partition by product_number order by "DATE") - product_count, 0) product_change
from test_tab t1
where (select count(1) from test_tab t2 where t1.product_number = t2.product_number and rownum < 3) > 1
)
另请参见是的,这些都是打字错误,对此表示抱歉。我希望现在能在帖子中修复这些问题。非常感谢您的回答,很遗憾,我有一个视图,而不是一个表,因此我得到的ROWID对于非材料表无效。您在问题中说了相反的事情-我有一个Oracle DB表。无论如何,这并不重要-这只是为了排除只有一行的产品,因此您可以使用任何其他方式,例如,在编辑的答案中使用一种方式。此外,在您当前的问题中,预期结果包含负的product_更改值,如果下一个日期的新值大于上一个条目的值,则该结果不匹配。差值应为0