| | 1 | ==== Просечно трошење во последните N дена |
| | 2 | - по корисник (со параметар p_user_id) |
| | 3 | - за цел систем (со параметар p_user_id = NULL) |
| | 4 | |
| | 5 | {{{#!sql |
| | 6 | CREATE OR REPLACE FUNCTION get_average_daily_spending_last_N_days( |
| | 7 | p_days INT, |
| | 8 | p_user_id INT DEFAULT NULL -- ако е NULL, се зема цел систем |
| | 9 | ) |
| | 10 | RETURNS TABLE ( |
| | 11 | average_spending NUMERIC |
| | 12 | ) |
| | 13 | LANGUAGE plpgsql |
| | 14 | AS $$ |
| | 15 | BEGIN |
| | 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; |
| | 36 | END; |
| | 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 | |
| | 49 | LEFT 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) |