Changes between Initial Version and Version 1 of AdvancedReport25


Ignore:
Timestamp:
12/29/25 19:38:40 (5 days ago)
Author:
211101
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • AdvancedReport25

    v1 v1  
     1==== Просечно трошење во последните N дена
     2- по корисник (со параметар p_user_id)
     3- за цел систем (со параметар p_user_id = NULL)
     4
     5{{{#!sql
     6CREATE OR REPLACE FUNCTION get_average_daily_spending_last_N_days(
     7    p_days INT,
     8    p_user_id INT DEFAULT NULL  -- ако е NULL, се зема цел систем
     9)
     10RETURNS TABLE (
     11    average_spending NUMERIC
     12)
     13LANGUAGE plpgsql
     14AS $$
     15BEGIN
     16    RETURN QUERY
     17    SELECT
     18        SUM(daily_spending) / p_days AS average_spending
     19    FROM (
     20        -- генерација на последни p_days
     21        SELECT
     22            d.day::date AS transaction_date,
     23            COALESCE(SUM(tb.spent_amount), 0) AS daily_spending
     24        FROM (
     25            SELECT generate_series(CURRENT_DATE - (p_days - 1), CURRENT_DATE, '1 day') AS day
     26        ) d
     27        LEFT JOIN transaction t
     28            ON t.date::date = d.day
     29        LEFT JOIN transaction_breakdown tb
     30            ON t.transaction_id = tb.transaction_id
     31        LEFT JOIN transaction_account ta
     32            ON tb.transaction_account_id = ta.transaction_account_id
     33            AND (p_user_id IS NULL OR ta.user_id = p_user_id)
     34        GROUP BY d.day
     35    ) daily_totals;
     36END;
     37$$;
     38}}}
     39
     40==== Релациона алгебра
     41- TA(transaction_account_id, user_id)
     42- T(transaction_id, date)
     43- TB(transaction_id, spent_amount)
     44- D(day) -- генерација на последните p_days
     45
     46Генерација на последни p_days:
     47- D ← { CURRENT_DATE − (p_days − 1), ..., CURRENT_DATE }
     48
     49LEFT JOIN со трансакции:
     50- J1 ← D ⟕,,TRUE,, T
     51- J2 ← J1 ⟕,,T.transaction_id = TB.transaction_id,, TB
     52- J3 ← J2 ⟕,,TB.transaction_account_id = TA.transaction_account_id ∧ (p_user_id IS NULL OR TA.user_id = p_user_id),, TA
     53
     54Групирање по ден и пресметка на дневно трошење:
     55- G ← γ,,day; Σ(spent_amount) → daily_spending,,(J3)
     56
     57Просечно дневно трошење (фиксно делење со p_days):
     58- R_final ← γ,,; (Σ(daily_spending) / p_days) → average_spending,,(G)