如何根据日期计算两个金额列的差额?

How to calculate the balance on the difference of two amount columns based on date?

我有一个 table,其中有两个不同的 AMOUNTS 列。 FIRST_AMOUNT & SECOND_AMOUNT。我需要找到两者之间差异的平衡。

例如,下面的 table 每个 number_id,我们有两个单独的金额列。我需要取 (FIRST_AMOUNT - SECOND_AMOUNT) 来计算差值。然后据此计算查询中的BALANCE

但是,由于我们接收数据的方式,我们需要减去金额的绝对值。所以 ABS(FIRST_AMOUNT) - ABS(SECOND_AMOUNT)。但是,如果 FIRST_AMOUNT 和 SECOND_AMOUNT 都有负数,我们需要减法也包括负数。所以 -80 (first_amount) 和 -32 (second_amount) 将是 (80-32) 带有负数,所以 -48。如果只有一列有负数,则进行正常减法。所以 -10 (first_amount) 和 0 (second_amount) 将是 -10.

然后我需要一个列来计算从 EARLIEST 日期开始的差额余额。

但是,在最后的查询中,我不想显示差异列,只显示余额。像这样:

有没有办法制定可以给出此结果的查询?

在Snowflake中这是微不足道的,因为你可以参考下面之前的输出计算,Snowflake可以看到如何解决依赖顺序,你可以说出你想要的。

当你开始向下嵌套 window 函数时,这会崩溃,但现在,它可以写在一个块中。

WITH data(number_id, first_amount, second_amount, date) AS (
    SELECT column1, column2, column3, to_date(column4, 'YYYY-MM-DD') FROM VALUES
    (111, -10, 0, '2021-12-23'),
    (111, -20, 0, '2021-12-22'),
    (111, 30, 0, '2021-12-21'),
    (111, -80, -32, '2021-12-20'),
    (111, 48, 0, '2021-12-19'),
    (111, 5, 5, '2021-12-18'),
    (111, 72, 72, '2021-12-17'),
    (111, 150, 150, '2021-12-16')
)
SELECT number_id
    ,FIRST_AMOUNT 
    ,SECOND_AMOUNT
    ,date
    ,FIRST_AMOUNT - SECOND_AMOUNT as difference
    ,sum( difference )over(partition by number_id order by date rows BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW ) as balance
FROM data
ORDER BY 1, 4 DESC;

给出:

NUMBER_ID FIRST_AMOUNT SECOND_AMOUNT DATE DIFFERENCE BALANCE
111 -10 0 2021-12-23 -10 0
111 -20 0 2021-12-22 -20 10
111 30 0 2021-12-21 30 30
111 -80 -32 2021-12-20 -48 0
111 48 0 2021-12-19 48 48
111 5 5 2021-12-18 0 0
111 72 72 2021-12-17 0 0
111 150 150 2021-12-16 0 0