Как в запросе вывести повторяющиеся записи со значениями 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 шт):
Если порядок действительно неважен, то попробуйте так:
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 включите необходимые столбцы, если порядок всё-таки важен.