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;