===== Надминување на баланс на една сметка со трансакција во сегашно време {{{#!sql CREATE OR REPLACE FUNCTION get_current_account_overdrafts() RETURNS TABLE ( user_id INT, user_name TEXT, account_name TEXT, current_balance NUMERIC, transaction_id INT, transaction_name TEXT, transaction_amount NUMERIC, transaction_date TIMESTAMP ) LANGUAGE plpgsql AS $$ BEGIN RETURN QUERY SELECT u.user_id, u.user_name, ta.account_name, ta.balance, t.transaction_id, t.transaction_name, tb.spent_amount, t.date 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 WHERE tb.spent_amount > ta.balance AND tb.spent_amount > 0 ORDER BY t.date DESC; END; $$; }}} ==== Релациона алгебра - U(user_id, user_name) - TA(transaction_account_id, user_id, account_name, balance) - TB(transaction_id, transaction_account_id, spent_amount) - T(transaction_id, transaction_name, date) JOIN на сите табели: - J1 ← TA ⨝,,TA.user_id = U.user_id,, U - J2 ← J1 ⨝,,TA.transaction_account_id = TB.transaction_account_id,, TB - J3 ← J2 ⨝,,TB.transaction_id = T.transaction_id,, T Филтрирање на трансакции што го надминуваат тековниот баланс: - R ← σ,,spent_amount > balance ∧ spent_amount > 0,,(J3) Подредување хронолошки (од најнова кон најстара трансакција): - R_final ← τ,,date DESC,,(R)