如何找出今天的金额与上一次在sql中发布事务时的金额之间的差异?

2guxujil  于 2021-07-24  发布在  Java
关注(0)|答案(1)|浏览(362)

我在sql中有一个表,它有几个不同的产品。例如,表中有100种产品,每种产品在表中一年中的每一天都有一行。
有些金额为空,因为当天没有报告任何数据,但该行仍然存在。请参见下面的表格示例:

ProductID / Date / Value
Product 1 / 2020-06-25 / 15.00
Product 1 / 2020-06-24 / 14.00
Product 1 / 2020-06-23 / 13.50
Product 1 / 2020-06-22 / NULL
Product 1 / 2020-06-21 / NULL
Product 1 / 2020-06-20 / 11.50
Product 2 / 2020-06-25 / 10.00
Product 2 / 2020-06-24 / 9.00
Product 2 / 2020-06-23 / 8.50
Product 2 / 2020-06-22 / 8.00
Product 2 / 2020-06-21 / 7.00
Product 2 / 2020-06-20 / 6.50

我试图创建一个视图,显示每个产品每天的变化率,并排除空值。视图应该找到不是今天的最新日期,并且该值不为空,然后将其与每个产品的今天金额进行比较。
换句话说,我希望视图显示以下内容:

a.ProductID / a.Date / a.Value / b.ProductID / b.Date / b.Value / ChangeinValue
Product 1 / 2020-06-25 / 15.00 / Product 1 / 2020-06-24 / 14.00 / 1.00
Product 1 / 2020-06-24 / 14.00 / Product 1 / 2020-06-23 / 13.50 / 0.50

* Product 1 / 2020-06-23 / 13.50 / Product 1 / 2020-06-20 / 11.50 / 2.00*

Product 2 / 2020-06-25 / 10.00 / Product 2 / 2020-06-24 / 9.00 / 1.00
Product 2 / 2020-06-24 / 9.00 / Product 2 / 2020-06-23 / 8.50 / 0.50
Product 2 / 2020-06-23 / 8.50 / Product 2 / 2020-06-22 / 8.00 / 0.50
Product 2 / 2020-06-22 / 8.00 / Product 2 / 2020-06-21 / 7.00 / 1.00
Product 2 / 2020-06-21 / 7.00 / Product 2 / 2020-06-20 / 6.50 / 0.50

任何帮助我将如何着手创建这个查询将不胜感激。

pieyvz9o

pieyvz9o1#

您可以使用窗口函数和一些过滤:

select *
from (
    select
        t.*,
        lag(date)   over(partition by productID order by date) lag_date,
        lag(value)  over(partition by productID order by date) lag_value,
        value - lag(value) over(partition by productID order by date) change
    from mytable t
    where value is not null
) t
where lag_value is not null

相关问题