wiki:AdvancedReport2

Version 2 (modified by 211101, 4 days ago) ( diff )

--

Надминување на баланс на една сметка со трансакција во сегашно време
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)
Note: See TracWiki for help on using the wiki.