如何根据日期计算两个金额列的差额?
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
我有一个 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 |