Получить последнее значение на основе другого столбца и независимо суммировать другой столбец - PullRequest
0 голосов
/ 02 июля 2019

Ситуация:

У меня есть таблица с платными и бесплатными транзакциями со столбцом баланса, который объединяет бесплатные и платные транзакции.

Цель:

Мне нужно получить общее количество оплаченных транзакций и самый последний остаток

Структура:

+-----------+---------+--------+-------------+------------+
| 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

Кажется, что это работает, но выглядит крайне неэффективно для таблиц с миллионами строк, в которых не указана дата отпуска.

Есть предложения?

1 Ответ

1 голос
/ 02 июля 2019

Один метод использует оконные функции и select distinct:

select distinct t.member_id,
       first_value(case when t.type = 'pay' then t.balance end) over (partition by t.member_id order by (case when t.type = 'pay' then 1 else 2 end), t.issue_date desc), 
       sum(t.amount) over (partition by t.member_id) as total
from table t;

К сожалению, в SQL нет функции агрегирования first_value().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...