Changes between Version 5 and Version 6 of WikiStart/Optimization/vtora_verzija


Ignore:
Timestamp:
04/01/25 22:43:35 (3 months ago)
Author:
203206
Comment:

mk2

Legend:

Unmodified
Added
Removed
Modified
  • WikiStart/Optimization/vtora_verzija

    v5 v6  
    1 == Оптимизиран SQL-код, кој работи поедноставно и побрзо
    2 
    3 
    4 === DDL код
     1= Оптимизиран SQL-код, кој работи поедноставно и побрзо
     2
     3
     4== DDL код
    55{{{
    66create table account(
     
    6464
    6565
    66 === Trigger 1
     66== Trigger 1
    6767{{{
    6868create or replace function after_transaction_trigger()
     
    110110
    111111
    112 === Trigger 2
     112== Trigger 2
    113113
    114114{{{
     
    153153}}}
    154154
     155
     156== Прикажи ги корисниците со најголем број на трансфери на пари(број на с-ка, корисничко име, e-mail, број на трансфери и ранг во растечки редослед)
     157
     158{{{
     159WITH transfer_frequency AS (
     160    SELECT t.s_id AS account_id, COUNT(*) AS transfer_count
     161    FROM transfer t
     162    GROUP BY t.s_id
     163
     164    UNION ALL
     165
     166    SELECT t.r_id AS account_id, COUNT(*) AS transfer_count
     167    FROM transfer t
     168    GROUP BY t.r_id
     169)
     170
     171SELECT *
     172FROM (
     173    SELECT a.id AS account_id,
     174           a.username,
     175           a.email,
     176           tf.transfer_count,
     177           RANK() OVER (ORDER BY tf.transfer_count DESC) AS transfer_rank
     178    FROM account a
     179    JOIN transfer_frequency tf ON a.id = tf.account_id
     180) ranked_accounts
     181WHERE transfer_rank <= 3
     182ORDER BY transfer_rank;
     183
     184
     185}}}
     186
     187== Корисници кои направиле најголеми или примиле најголеми износи на трансфери и вкупен износ на трансфери(број на с-ка, корисничко име, e-mail, вкупен износ на сите трансфери по корисник и ранг на корисник во растечки редослед)
     188
     189{{{
     190WITH transfer_amount AS (
     191    SELECT t.s_id AS account_id, SUM(tr.amount) AS total_transfer
     192    FROM transfer t
     193    JOIN "transaction" tr ON t.id = tr.id
     194    GROUP BY t.s_id
     195
     196    UNION ALL
     197
     198    SELECT t.r_id AS account_id, SUM(tr.amount) AS total_transfer
     199    FROM transfer t
     200    JOIN "transaction" tr ON t.id = tr.id
     201    GROUP BY t.r_id
     202),
     203
     204aggregated_transfers AS (
     205    SELECT account_id, SUM(total_transfer) AS total_transfer_amount
     206    FROM transfer_amount
     207    GROUP BY account_id
     208)
     209
     210SELECT a.id AS account_id,
     211       a.username,
     212       a.email,
     213       COALESCE(at.total_transfer_amount, 0) AS total_transfer_amount,
     214       RANK() OVER (ORDER BY COALESCE(at.total_transfer_amount, 0) DESC) AS transfer_rank
     215FROM account a
     216LEFT JOIN aggregated_transfers at ON a.id = at.account_id
     217ORDER BY transfer_rank
     218LIMIT 3;
     219}}}
     220
     221== Корисници со највисок износ на депозити
     222
     223{{{
     224
     225WITH deposit_totals AS (
     226    SELECT account_id, SUM(amount) AS total_deposit
     227    FROM deposit
     228    GROUP BY account_id
     229)
     230
     231SELECT a.id AS account_id,
     232       a.username,
     233       a.email,
     234       COALESCE(dt.total_deposit, 0) AS total_deposit,
     235       RANK() OVER (ORDER BY COALESCE(dt.total_deposit, 0) DESC) AS deposit_rank
     236FROM account a
     237LEFT JOIN deposit_totals dt ON a.id = dt.account_id
     238ORDER BY deposit_rank
     239LIMIT 3;
     240}}}
     241
     242
     243== Најактивните корисници во последните 30 дена
     244{{{
     245WITH recent_activity AS (
     246    SELECT account_id, COUNT(*) AS activity_count
     247    FROM "transaction"
     248    WHERE timestamp >= NOW() - INTERVAL '30 days'
     249    GROUP BY account_id
     250)
     251
     252SELECT a.id AS account_id,
     253       a.username,
     254       a.email,
     255       COALESCE(ra.activity_count, 0) AS recent_transactions
     256FROM account a
     257LEFT JOIN recent_activity ra ON a.id = ra.account_id
     258ORDER BY recent_transactions DESC
     259LIMIT :top_n;
     260
     261
     262
     263}}}
     264