【问题标题】:How to calculate difference between 2 entries based on dates?如何根据日期计算 2 个条目之间的差异?
【发布时间】:2020-08-27 16:08:52
【问题描述】:

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

在哪里,

  • DATE 是日期
  • NUMBER 是唯一的产品编号
  • COUNT 是存储设施中产品编号的项目数
  • FACTOR 是可放入存储架的产品数量

我现在需要知道自上次更新每个产品编号以来它发生了多少变化。 由于第一个条目没有可比较的过去日期,因此未定义更改,例如 NULL、NONE、0 左右。没关系,只要我以后可以过滤掉。

有些产品只有 1 个条目,应忽略这些条目(无需计算差异)。

最终结果应该是:

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 中实现这一点?

【问题讨论】:

    标签: oracle date difference


    【解决方案1】:

    最终结果有点不清楚:

    • 为什么要比较 product_number 2 15 和 5 的值 - 2019-06-01 小于 2019-08-01 并且应该是第一行
    • 为什么第一行产品 1 的 change_factor 为 3 而产品 2 为空
    • 为什么 2019-02-11 的 change_factor 计算为 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
    )
    

    fiddle

    另见LAG documentation

    【讨论】:

    • 是的,那些是拼写错误,抱歉。我(希望)现在在帖子中修复了这些问题。非常感谢您的回答,遗憾的是我有一个视图,而不是一个表,所以我得到“ROWID 对非材料表无效”。
    • 您在问题中说了相反的话 - “我有一个 Oracle DB ”。无论如何,这并不重要 - 这个“存在”只是排除只有一行的产品,所以你可以使用任何其他方式,例如编辑后的答案中的一个。此外,在您当前的问题中,预期结果包含负 product_change 值,并且与“如果下一个日期的新值大于最后一个条目的差异应为 0”不匹配
    猜你喜欢
    • 2019-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-21
    • 1970-01-01
    • 2022-01-08
    • 2010-11-08
    相关资源
    最近更新 更多