| Version 2 (modified by , 4 days ago) ( diff ) |
|---|
Трендови на трошење според тагови за корисник
Сумирање на трошењата според тагови во последните 6 месеци за одреден корисник
CREATE OR REPLACE FUNCTION get_spending_trends_last_6_months_user(
p_user_id INT
)
RETURNS TABLE (
tag_name TEXT,
month DATE,
total_spent NUMERIC
)
LANGUAGE plpgsql
AS $$
BEGIN
RETURN QUERY
SELECT
tg.tag_name,
DATE_TRUNC('month', t.date) AS month,
COALESCE(SUM(tb.spent_amount), 0) AS total_spent
FROM tag_assigned_to_transaction tat
JOIN transaction t
ON tat.transaction_id = t.transaction_id
JOIN transaction_breakdown tb
ON t.transaction_id = tb.transaction_id
JOIN transaction_account ta
ON tb.transaction_account_id = ta.transaction_account_id
JOIN tag tg
ON tat.tag_id = tg.tag_id
WHERE ta.user_id = p_user_id
AND t.date >= DATE_TRUNC('month', CURRENT_DATE - INTERVAL '6 MONTHS')
GROUP BY tg.tag_name, month
ORDER BY tg.tag_name, month;
END;
$$;
Релациона алгебра
- TA(transaction_account_id, user_id)
- T(transaction_id, date)
- TB(transaction_id, transaction_account_id, spent_amount)
- TAT(tag_id, transaction_id)
- TG(tag_id, tag_name)
JOIN на сите табели:
- J1 ← TA ⨝TA.transaction_account_id = TB.transaction_account_id TB
- J2 ← J1 ⨝TB.transaction_id = T.transaction_id T
- J3 ← J2 ⨝T.transaction_id = TAT.transaction_id TAT
- J4 ← J3 ⨝TAT.tag_id = TG.tag_id TG
Филтрирање по корисник и последни 6 месеци:
- F ← σuser_id = p_user_id ∧ date >= DATE_TRUNC('month', CURRENT_DATE - INTERVAL '6 MONTHS')(J4)
Групирање по таг и месец:
- G ← γtag_name, month = DATE_TRUNC('month', date); Σ(spent_amount) → total_spent(F)
Подредување по таг и месец:
- R_final ← τtag_name, month(G)
Note:
See TracWiki
for help on using the wiki.
