Changes between Version 1 and Version 2 of AdvancedReport9


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

--

Legend:

Unmodified
Added
Removed
Modified
  • AdvancedReport9

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