необходимо сгруппировать записи на основе совпадений - PullRequest
0 голосов
/ 18 февраля 2020

Этот вопрос является продолжением моего предыдущего поста.

Необходимость группировки записей на основе сопоставления в sql

Я буду более понятен с одним комплексом пример из моей таблицы транзакций.

Row_Number  LOAN_ID TXN_ENTRY_API_NAME          TXN_AMT
        1   100     ReverseSpreadPayment        2250
        2   100     SpreadPayment               -2250
        3   100     ReverseSpreadPayment        2250
        4   100     SpreadPayment               -2250
        5   100     ReverseSpreadPayment        2250
        6   100     SpreadPayment               -2250
        7   100     ReverseSpreadPayment        2250
        8   100     ReverseSpreadPayment        2250
        9   100     SpreadPayment               1000

В приведенном выше примере

число 1 и 2 совпадает с записями, bcoz-платеж имеет связанный обратный платеж, следовательно, суммируйте эти два. rownumber 3 и 4 совпадают записи bcoz платеж имеет связанный обратный платеж, следовательно, сумма этих двух. rownumber 5 и 6 - совпадающие записи. bcoz-платеж связан с обратным платежом, следовательно, суммируйте эти два. У rownumber 7 нет соответствующей совпадающей суммы платежа, следовательно, он является пустым. Оставь как есть. rownumber 8 не имеет соответствующей совпадающей суммы платежа, следовательно, является пустым. Оставь как есть. rownumber 9 не имеет соответствующей совпадающей суммы обратного платежа, следовательно, является пустым. Оставьте все как есть.

Чтобы лучше вас понять, я просто добавил сюда столбец row_number, где, как и в моей таблице транзакций, у нас нет столбца row_number.

Мой ожидаемый результат должен быть таким, как в таблице ниже .

                    LOAN_ID     TXN_ENTRY_API_NAME                 TXN_AMT
                        100     ReverseSpreadPayment,SpreadPayment  0
                        100     ReverseSpreadPayment,SpreadPayment  0
                        100     ReverseSpreadPayment,SpreadPayment  0
                        100     ReverseSpreadPayment                2250
                        100     ReverseSpreadPayment                2250
                        100     SpreadPayment                       1000

То, что я ожидаю, чтобы сгенерировать функцию номера строки, как показано ниже, чтобы я мог сгруппировать, используя столбец номера строки.

Номер строки - это столбец порядка, сгенерированный мной. Вот и все.

1 Ответ

0 голосов
/ 18 февраля 2020

Я думаю, что это просто row_number() и агрегация:

select listagg(row_number, ',') within group (order by row_number) as row_numbers,
       loan_id, txn_entry_api_name, sum(txn_amt) as txn_amt,
       listagg(txn_entry_api_name, ',') within group (order by row_number) as txn_entry_api_name
from (select t.*,
             row_number() over (partition by loan_id, txn_entry_api_name, abs(txn_amt) order by row_number) as seqnum
      from t
     ) t
group by seqnum;
...