Cumulative
🧩 Syntax:
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;