Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle 如何根据日期计算两个条目之间的差异?_Oracle_Date_Difference - Fatal编程技术网

Oracle 如何根据日期计算两个条目之间的差异?

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

我有一个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              | 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