Ситуация:
У меня есть таблица с платными и бесплатными транзакциями со столбцом баланса, который объединяет бесплатные и платные транзакции.
Цель:
Мне нужно получить общее количество оплаченных транзакций и самый последний остаток
Структура:
+-----------+---------+--------+-------------+------------+
| member_id | balance | amount | type | issue_date |
+-----------+---------+--------+-------------+------------+
| varchar | int | int | pay or free | datetime |
+-----------+---------+--------+-------------+------------+
Текущий запрос:
select t1.member_id, t2.balance, sum(t1.amount) as total
from table AS t1
inner join (select member_id,
balance,
ROW_NUMBER() over (partition by member_id order by issue_date desc) AS ranks
from table
) AS t2 on t1.member_id=t2.member_id and t2.ranks = 1
where [type] = 'pay'
group by t1.member_id, t2.balance
Кажется, что это работает, но выглядит крайне неэффективно для таблиц с миллионами строк, в которых не указана дата отпуска.
Есть предложения?