wiki:AdvancedReport4

Version 3 (modified by 211101, 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.