WITH active_wallets AS ( SELECT DISTINCT unnest("TipsWallets") AS wallet_address FROM "Servers" WHERE "IsActive" = true ), aggregated_data AS ( SELECT date_trunc('minute', "TransactionDate") - (EXTRACT(MINUTE FROM "TransactionDate")::int % 5) * INTERVAL '1 minute' AS five_minute_slot, "WalletAddress", SUM("Fee") AS sum_fee FROM "SwapTransactions" WHERE "TransactionDate" >= NOW() - INTERVAL '24 hours' AND "WalletAddress" IN (SELECT wallet_address FROM active_wallets) GROUP BY 1, 2 ), wallet_list AS ( SELECT wallet_address, 'address_' || ROW_NUMBER() OVER (ORDER BY wallet_address) AS address_alias FROM active_wallets ), per_slot AS ( SELECT five_minute_slot, SUM(sum_fee) AS total_sum_fee FROM aggregated_data GROUP BY five_minute_slot ), wallet_sums AS ( SELECT a.five_minute_slot, w.wallet_address, w.address_alias, COALESCE(SUM(a.sum_fee), 0) AS wallet_sum FROM wallet_list w CROSS JOIN (SELECT DISTINCT five_minute_slot FROM aggregated_data) s LEFT JOIN aggregated_data a ON a."WalletAddress" = w.wallet_address AND a.five_minute_slot = s.five_minute_slot GROUP BY a.five_minute_slot, w.wallet_address, w.address_alias ), pivoted_data AS ( SELECT five_minute_slot, jsonb_object_agg(address_alias, wallet_sum) AS wallet_sums FROM wallet_sums GROUP BY five_minute_slot ) SELECT p.five_minute_slot, -- Динамическое создание кумулятивных сумм для каждого кошелька (SELECT jsonb_object_agg(key, SUM(value::numeric) OVER (ORDER BY p2.five_minute_slot)) FROM ( SELECT p2.five_minute_slot, (p2.wallet_sums -> key)::numeric as value FROM pivoted_data p2 WHERE p2.five_minute_slot <= p.five_minute_slot ORDER BY p2.five_minute_slot ) t, jsonb_object_keys(p.wallet_sums) as key) AS cumulative_sums FROM pivoted_data p ORDER BY p.five_minute_slice;