簡體   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