Как в запросе вывести повторяющиеся записи со значениями NULL в некоторых столбцах?

Есть готовая выборка данных, вывод которой выглядит так:

    cчет                 пластик     дебит     кредит
    -------------------- ---------- ------ ----------
    40812345658564500001 dhgfhsd      2131       3131
    40812345658564500002 shsrhhrsh    2354   35345435
**  40812345658564500003 srrsebghn     125         60
**  40812345658564500003 srghhtsrt     125         60
    40812345658564500004 hthwgwrwg  657567     567567
    40812345658564500005 wrwgwrg    756757     567567

Проблема в том, что есть строки в которых дублируются счета. Т.е. прошел перевыпуск карты, счет остался, а пластик поменялся. Дебит и кредит также совпадают.

Мне необходимо обработать эту выборку так, чтобы у таких строк (выделенных **) с одинаковым счетом первая строка осталась без изменения, а все последующие строки для этого счета не имели дебета и кредита, чтобы можно было корректно просуммировать. Вообще, удалять лишние строки нельзя, информация по пластику должна остаться.

Как это можно сделать?

У меня получился такой запрос, он работает, но выглядит как-то очень сложно:

WITH 
T1 AS(SELECT * FROM rabota), --все
T2 AS(SELECT * FROM T1 WHERE accnt_acnt IN (SELECT accnt_acnt --дубли
                                              FROM T1
                                             GROUP BY accnt_acnt
                                            HAVING COUNT(accnt_acnt) > 1)),
T3 AS(SELECT * FROM T1 WHERE accnt_acnt NOT IN (SELECT accnt_acnt --без дублей
                                                  FROM T1
                                                 GROUP BY accnt_acnt
                                                HAVING COUNT(accnt_acnt) > 1)),
T4 AS(SELECT row_number() over(partition BY accnt_acnt ORDER BY accnt_acnt, palstic) numer, 
             T2.*
        FROM T2
       ORDER BY accnt_acnt, palstic)
SELECT * FROM T3
UNION
SELECT accnt_acnt, palstic, debit, credit FROM T4
 WHERE numer = 1
UNION
SELECT accnt_acnt, palstic, NULL, NULL FROM T4
WHERE numer != 1

Ответы (1 шт):

Автор решения: 0xdb

Если порядок действительно неважен, то попробуйте так:

create table t1 as 
    select 408120001 accno, dbms_random.string ('l',9) card, 125 debit, 60 credit
    from dual connect by level<=3;

select t1.accno, t1.card, t2.debit, t2.credit
from t1
left join (
    select t1.*, rowid, row_number () over (partition by accno order by null) rn 
    from t1) t2 on t2.rowid = t1.rowid and rn = 1;

Даст желаемый результат:

       ACCNO CARD            DEBIT     CREDIT
------------ ---------- ---------- ----------
   408120001 trlhubnjd         125         60
   408120001 keitngeni                       
   408120001 suirsipcw                       

В ORDER BY включите необходимые столбцы, если порядок всё-таки важен.

→ Ссылка