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