| 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; |
| | 4 | CREATE OR REPLACE FUNCTION get_average_daily_spending_last_3_days_user( |
| | 5 | p_user_id INT |
| | 6 | ) |
| | 7 | RETURNS TABLE ( |
| | 8 | average_spending_last_3_days NUMERIC |
| | 9 | ) |
| | 10 | LANGUAGE plpgsql |
| | 11 | AS $$ |
| | 12 | BEGIN |
| | 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; |
| | 36 | END; |
| | 37 | $$; |
| | 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 | |
| | 49 | LEFT 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) |