根据日期从以前的金额计算余额?
Calculating the balance from the previous amount based on DATE?
我有一个 table,其中包含每个用户的交易金额。我正在尝试查询还显示 'balance' 列的 table。
所以在上图中,我按日期排序,现在,我想要另一列来计算余额。因此,在余额列中,从最后一条记录(最早的记录)开始,该行将从 $150 开始,然后下一行将计算当前金额 - 之前的金额。
所以它应该看起来像这样:
有办法吗?
因此,对于数据的 CTE,您可以使用 SUM 的 WINDOW FUNCTUON 版本来获得您想要的结果。
WITH data(number_id, value, date) AS (
SELECT column1, column2, to_date(column3, 'YYYY-MM-DD') FROM VALUES
(1, 10, '2022-01-01'),
(1, 20, '2022-01-02'),
(1, 30, '2022-01-04'),
(1, 40, '2022-01-07'),
(2, 110, '2022-01-01'),
(2, 120, '2022-01-02'),
(2, 130, '2022-01-04'),
(2, 140, '2022-01-07')
)
SELECT number_id
,value
,sum(value)over(partition by number_id order by date rows BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW ) as balance
date
FROM data
ORDER BY 1, 4;
给出:
NUMBER_ID
VALUE
BALANCE
DATE
1
10
10
2022-01-01
1
20
30
2022-01-02
1
30
60
2022-01-04
1
40
100
2022-01-07
2
110
110
2022-01-01
2
120
230
2022-01-02
2
130
360
2022-01-04
2
140
500
2022-01-07
用你的数字(72
更正为-72
):
WITH data(number_id, value, date) AS (
SELECT column1, column2, to_date(column3, 'YYYY-MM-DD') FROM VALUES
(111, -22, '2021-12-24'),
(111, 22, '2021-12-23'),
(111, -10, '2021-12-22'),
(111, -30, '2021-12-21'),
(111, 5, '2021-12-20'),
(111, -48, '2021-12-19'),
(111, 5, '2021-12-18'),
(111, -72, '2021-12-17'),
(111, 150, '2021-12-16')
)
SELECT number_id
,value
,sum(value)over(partition by number_id order by date rows BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW ) as balance
,date
FROM data
ORDER BY 1, 4 DESC;
给出:
NUMBER_ID
VALUE
BALANCE
DATE
111
-22
0
2021-12-24
111
22
22
2021-12-23
111
-10
0
2021-12-22
111
-30
10
2021-12-21
111
5
40
2021-12-20
111
-48
35
2021-12-19
111
5
83
2021-12-18
111
-72
78
2021-12-17
111
150
150
2021-12-16
我有一个 table,其中包含每个用户的交易金额。我正在尝试查询还显示 'balance' 列的 table。
所以它应该看起来像这样:
有办法吗?
因此,对于数据的 CTE,您可以使用 SUM 的 WINDOW FUNCTUON 版本来获得您想要的结果。
WITH data(number_id, value, date) AS (
SELECT column1, column2, to_date(column3, 'YYYY-MM-DD') FROM VALUES
(1, 10, '2022-01-01'),
(1, 20, '2022-01-02'),
(1, 30, '2022-01-04'),
(1, 40, '2022-01-07'),
(2, 110, '2022-01-01'),
(2, 120, '2022-01-02'),
(2, 130, '2022-01-04'),
(2, 140, '2022-01-07')
)
SELECT number_id
,value
,sum(value)over(partition by number_id order by date rows BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW ) as balance
date
FROM data
ORDER BY 1, 4;
给出:
NUMBER_ID | VALUE | BALANCE | DATE |
---|---|---|---|
1 | 10 | 10 | 2022-01-01 |
1 | 20 | 30 | 2022-01-02 |
1 | 30 | 60 | 2022-01-04 |
1 | 40 | 100 | 2022-01-07 |
2 | 110 | 110 | 2022-01-01 |
2 | 120 | 230 | 2022-01-02 |
2 | 130 | 360 | 2022-01-04 |
2 | 140 | 500 | 2022-01-07 |
用你的数字(72
更正为-72
):
WITH data(number_id, value, date) AS (
SELECT column1, column2, to_date(column3, 'YYYY-MM-DD') FROM VALUES
(111, -22, '2021-12-24'),
(111, 22, '2021-12-23'),
(111, -10, '2021-12-22'),
(111, -30, '2021-12-21'),
(111, 5, '2021-12-20'),
(111, -48, '2021-12-19'),
(111, 5, '2021-12-18'),
(111, -72, '2021-12-17'),
(111, 150, '2021-12-16')
)
SELECT number_id
,value
,sum(value)over(partition by number_id order by date rows BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW ) as balance
,date
FROM data
ORDER BY 1, 4 DESC;
给出:
NUMBER_ID | VALUE | BALANCE | DATE |
---|---|---|---|
111 | -22 | 0 | 2021-12-24 |
111 | 22 | 22 | 2021-12-23 |
111 | -10 | 0 | 2021-12-22 |
111 | -30 | 10 | 2021-12-21 |
111 | 5 | 40 | 2021-12-20 |
111 | -48 | 35 | 2021-12-19 |
111 | 5 | 83 | 2021-12-18 |
111 | -72 | 78 | 2021-12-17 |
111 | 150 | 150 | 2021-12-16 |