Сумма до достижения значения — Teradata

В Teradata мне нужен запрос, чтобы сначала идентифицировать всех участников в MEM TABLE, которые в настоящее время имеют отрицательный баланс, давайте назовем это CUR_BAL. Затем, только для всех этих участников, суммируйте все транзакции из TRAN TABLE по дате, пока сумма этих транзакций не будет равна CUR_BAL.

Редактирование для добавления третьей таблицы ADJ, содержащей MEM_NBR, ADJ_DT и ADJ_AMT, которые необходимо включить в промежуточный итог, чтобы зафиксировать все записи.

Я хотел бы, чтобы результат включал MEM.MEM_NBR, MEM.CUR_BAL, TRAN.TRAN_DATE ИЛИ ADJ.ADJ_DT (дата, связанная с транзакцией, в результате которой промежуточный итог был равен CUR_BAL), MEM.LST_UPD_DT. Мне не нужно знать, стал ли баланс отрицательным в результате транзакции или корректировки, достаточно знать дату, когда он стал отрицательным.

Спасибо!


person Donna Panzarotti    schedule 20.06.2012    source источник


Ответы (1)


select
    mem_nbr,
    cur_bal,
    tran_date,
    tran_type
from (
    select
        a.mem_nbr,
        a.cur_bal,
        b.tran_date,
        b.tran_type,
        a.lst_upd_dt,
        sum(b.tran_amt) over (partition by b.mem_nbr order by b.tran_date rows between unbounded preceding and current row) as cumulative_bal
    from mem a
    inner join (
        select
            mem_nbr,
            tran_date,
            tran_amt,
            'Tran' as tran_type
        from tran
        union all
        select
            mem_nbr,
            adj_date,
            adj_amt,
            'Adj' as tran_type
        from adj
    ) b
    on a.mem_nbr = b.mem_nbr
    where a.cur_bal < 0
    qualify cumulative_bal < 0
) z
qualify rank() over (partition by mem_nbr order by tran_date) = 1

Подзапрос выбирает все экземпляры с отрицательным совокупным балансом, затем внешний запрос выбирает самый ранний из них. Если вам нужна самая последняя, ​​добавьте desc после tran_date в последней строке qualify.

person lins314159    schedule 21.06.2012
comment
Благодарю за ваш ответ. Я ищу пару вещей. Мне нужен текущий баланс (если он отрицательный) и дата их последней транзакции, а также дата, когда они стали отрицательными, что могло быть много транзакций назад, чтобы я мог выяснить, почему они стали отрицательными в первую очередь. Я попробую ваш ответ через некоторое время и отпишусь!! Спасибо еще раз! - person Donna Panzarotti; 21.06.2012
comment
отредактировано, чтобы добавить дополнительную таблицу с корректировками, которые мне также необходимо учитывать. Не знаю, как присоединиться к третьему столу, включив эти даты в последовательность. Ваш код отлично работал с двумя таблицами, но не возвращал все необходимые учетные записи, потому что я не подумал о таблице ADJ. Можете ли вы помочь со вторым соединением? Спасибо еще раз! - person Donna Panzarotti; 21.06.2012
comment
Я не совсем понимаю, как работает ваша таблица корректировок. Было бы лучше, если бы вы включили некоторые образцы данных и прогнали то, что вы ожидаете в результате. - person lins314159; 22.06.2012
comment
Спасибо за ваш ответ. По сути, таблица Adj аналогична таблице транзакций, за исключением того, что в ней хранятся корректировки вместо реальных транзакций. Корректировки изменяют конечный баланс так же, как и обычная транзакция. Так что я думаю, вы могли бы думать об этом как о второй таблице транзакций. Это помогает? - person Donna Panzarotti; 22.06.2012