| Version 2 (modified by , 4 days ago) ( diff ) |
|---|
Надминување на вкупниот баланс на сите сметки на корисникот во сегашно време
Овде ќе го собереме моменталниот баланс на сите сметки на корисникот и ќе провериме дали сумата на моменталната трансакцијата ја надминува вкупна вредност
CREATE OR REPLACE FUNCTION get_current_user_total_balance_overdrafts()
RETURNS TABLE (
user_id INT,
user_name TEXT,
transaction_id INT,
transaction_amount NUMERIC,
user_total_balance NUMERIC
)
LANGUAGE plpgsql
AS $$
BEGIN
RETURN QUERY
WITH total_user_balance AS (
SELECT
u.user_id,
SUM(ta.balance) AS total_balance
FROM transaction_account ta
JOIN "user" u ON ta.user_id = u.user_id
GROUP BY u.user_id
)
SELECT
u.user_id,
u.user_name,
t.transaction_id,
tb.spent_amount AS transaction_amount,
tub.total_balance AS user_total_balance
FROM transaction_account ta
JOIN "user" u ON ta.user_id = u.user_id
JOIN transaction_breakdown tb ON ta.transaction_account_id = tb.transaction_account_id
JOIN transaction t ON tb.transaction_id = t.transaction_id
JOIN total_user_balance tub ON u.user_id = tub.user_id
WHERE
tb.spent_amount > tub.total_balance
AND tb.spent_amount > 0
AND t.date <= CURRENT_DATE;
END;
$$;
Релациона алгебра
- U(user_id, user_name)
- TA(transaction_account_id, user_id, balance)
- TB(transaction_id, transaction_account_id, spent_amount)
- T(transaction_id, date)
JOIN за пресметка на вкупен моментален баланс по корисник:
- J1 ← TA ⨝TA.user_id = U.user_id U
- TBAL ← γuser_id; Σ(balance) → total_balance(J1)
JOIN на сите табели за трансакции:
- J2 ← TA ⨝TA.user_id = U.user_id U
- J3 ← J2 ⨝TA.transaction_account_id = TB.transaction_account_id TB
- J4 ← J3 ⨝TB.transaction_id = T.transaction_id T
- J5 ← J4 ⨝U.user_id = TBAL.user_id TBAL
Филтрирање на трансакции кои го надминуваат ВКУПНИОТ моментален баланс:
- R ← σspent_amount > total_balance ∧ spent_amount > 0 ∧ date ≤ CURRENT_DATE(J5)
Подредување по корисник:
- R_final ← τuser_id(R)
Note:
See TracWiki
for help on using the wiki.
