繁体   English   中英

如何使用 sum 计算 sql 中的总余额?

[英]How to calculate total balance in sql using sum?

更新的问题——

我有一个包含以下列的表:

DROP TABLE TABLE_1;
CREATE TABLE TABLE_1(
TRANSACTION_ID number, USER_KEY number,AMOUNT number,CREATED_DATE DATE, UPDATE_DATE DATE
);

insert into TABLE_1
values ('001','1001',75,'2022-12-02','2022-12-03'),
('001','1001',-74.98,'2022-12-02','2022-12-03'),
('001','1001',74.98,'2022-12-03','2022-12-04'),
('001','1001',-75,'2022-12-03','2022-12-04')

我需要根据更新日期计算余额。 在某些情况下,两条不同的记录可能有相同的 update_date。 当我有这个时,我想抓住余额的较低值。

这是我到目前为止的查询:

select * from (
select TRANSACTION_ID,USER_KEY,AMOUNT,CREATED_DATE,UPDATE_DATE,
sum(AMOUNT) over(partition by USER_KEY order by UPDATE_DATE rows BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) as TOTAL_BALANCE_AMOUNT
from TABLE_1
) qualify row_number() over (partition by USER_KEY order by UPDATE_DATE DESC, UPDATE_DATE DESC) = 1

在上面的查询中,在我尝试仅获取 LAST 余额之后,它正在获取 75,而不是 0。

有没有办法在限定查询中包含最后一个余额,但如果日期相同,则获取最低余额?

为什么第二个查询显示 4 个不同的记录余额?

这就是“总计”的意义所在。 如果目标是在整个 window 中拥有一个值,则应跳过 order by:

select USER_KEY, 
       sum(AMOUNT) over(partition by USER_KEY) as TOTAL_BALANCE_AMOUNT
from TABLE1;

partition by 子句可以进一步扩展为每个 user_key/date 生成 output:

select USER_KEY, 
       sum(AMOUNT) over(partition by USER_KEY,date) as TOTAL_BALANCE_AMOUNT
from TABLE1;

我认为您正在寻找类似的东西,按 USER_ID、DATE 聚合,然后计算运行总和。 如果这不是您要查找的内容,也不是 Lukasz Szozda 的答案,请编辑问题以显示预期的 output。

    create or replace table T1(USER_KEY int, AMOUNT number(38,2), "DATE" date);
    
    insert into T1(USER_KEY, AMOUNT, "DATE") values
    (1001, 75,  '2022-12-02'),
    (1001, -75, '2022-12-02'),
    (1001, 75,  '2022-12-03'),
    (1001, -75, '2022-12-03');
    
-- Option 1, aggregate after window
select USER_KEY, "DATE", min(TOTAL_BALANCE_AMOUNT) as MINIMUM_BALANCE from 
(
select USER_KEY, "DATE", sum(AMOUNT)
over(partition by USER_KEY order by DATE, AMOUNT desc rows BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) as TOTAL_BALANCE_AMOUNT from
T1
)
group by USER_KEY, "DATE"
;

--Option 2, qualify by partitioning by user and day, reversing the order of transactions
select USER_KEY, "DATE", sum(AMOUNT)
over(partition by USER_KEY order by DATE, AMOUNT desc rows BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) as TOTAL_BALANCE_AMOUNT
from
T1
qualify row_number() over (partition by USER_KEY, DATE order by DATE, AMOUNT asc) = 1
;
用户密钥 日期 TOTAL_BALANCE_AMOUNT
1001 2022-12-02 00:00:00 0
1001 2022-12-03 00:00:00 0

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM