c датой регистрации
users(uuid uuid, regdate date, email text)
Вторая - движение денег между юзерами в разных валютах. USD, EUR
transactions(currency text, amount numeric, debet_code uuid, credit_code uuid)
Нужен запрос отдающий количество регистраций по дням, с суммами по дебету и кредиту тех юзеров, что в тот день зарегистрировались. Со списком самих юзеров
"day","registrations", "debet_usd", "debet_eur", "credit_usd", "credit_eur”, “users_list”
У меня получилось так.
with deb as (
select debet_code as user_uuid,
currency,
sum(amount) as amount
from transactions
group by 1, 2
),
cred as (
select credit_code as user_uuid,
currency,
sum(amount) as amount
from transactions
group by 1, 2
)
select u.regdate as day,
count(1) as registrations,
sum( (select amount from deb
where user_uuid = u.uuid and currency='USD' ) ) as debet_usd,
sum( (select amount from deb
where user_uuid = u.uuid and currency='EUR' ) ) as debet_eur,
sum( (select amount from cred
where user_uuid = u.uuid and currency='USD' ) ) as credit_usd,
sum( (select amount from cred
where user_uuid = u.uuid and currency='EUR' ) ) as credit_usd,
jsonb_agg(u.uuid) as users_list
from users
group by 1;
Но мне не нравится, что тут четыре подзапроса для каждой строки.
Как это написать лучше?
С кофеварки разглядеть сложно, но это точно плохой запрос? Он медленный или еще чего?..
Первая реакция: sum( (select amount from deb where user_uuid = u.uuid and currency='USD' ) ) as debet_usd заменить на case when deb.currency = 'USD' then sum(deb.amount) end case;
Обсуждают сегодня