===== Надминување на вкупниот баланс на сите сметки на корисникот во сегашно време Овде ќе го собереме моменталниот баланс на сите сметки на корисникот и ќе провериме дали сумата на моменталната трансакцијата ја надминува вкупна вредност {{{#!sql 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)