wiki:AdvancedReport25

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

--

Просечно трошење во последните N дена

  • по корисник (со параметар p_user_id)
  • за цел систем (со параметар p_user_id = NULL)
CREATE OR REPLACE FUNCTION get_average_daily_spending_last_N_days(
    p_days INT,
    p_user_id INT DEFAULT NULL  -- ако е NULL, се зема цел систем
)
RETURNS TABLE (
    average_spending NUMERIC
)
LANGUAGE plpgsql
AS $$
BEGIN
    RETURN QUERY
    SELECT
        SUM(daily_spending) / p_days AS average_spending
    FROM (
        -- генерација на последни p_days
        SELECT
            d.day::date AS transaction_date,
            COALESCE(SUM(tb.spent_amount), 0) AS daily_spending
        FROM (
            SELECT generate_series(CURRENT_DATE - (p_days - 1), CURRENT_DATE, '1 day') AS day
        ) d
        LEFT JOIN transaction t
            ON t.date::date = d.day
        LEFT JOIN transaction_breakdown tb
            ON t.transaction_id = tb.transaction_id
        LEFT JOIN transaction_account ta
            ON tb.transaction_account_id = ta.transaction_account_id
            AND (p_user_id IS NULL OR ta.user_id = p_user_id)
        GROUP BY d.day
    ) daily_totals;
END;
$$;

Релациона алгебра

  • TA(transaction_account_id, user_id)
  • T(transaction_id, date)
  • TB(transaction_id, spent_amount)
  • D(day) -- генерација на последните p_days

Генерација на последни p_days:

  • D ← { CURRENT_DATE − (p_days − 1), ..., CURRENT_DATE }

LEFT JOIN со трансакции:

  • J1 ← D ⟕TRUE T
  • J2 ← J1 ⟕T.transaction_id = TB.transaction_id TB
  • J3 ← J2 ⟕TB.transaction_account_id = TA.transaction_account_id ∧ (p_user_id IS NULL OR TA.user_id = p_user_id) TA

Групирање по ден и пресметка на дневно трошење:

  • G ← γday; Σ(spent_amount) → daily_spending(J3)

Просечно дневно трошење (фиксно делење со p_days):

  • R_final ← γ; (Σ(daily_spending) / p_days) → average_spending(G)
Note: See TracWiki for help on using the wiki.