группировка строк, которые идут от отрицательного до большего или равного 0 - PullRequest
0 голосов
/ 29 января 2019

Я пытаюсь сгруппировать случаи, когда остаток на счете одного аккаунта изменяется от отрицательного до большего или равного 0. Например, в приведенной ниже таблице account1 трижды переходит от отрицательного значения к большему или равному 0,Я хотел бы автоматизировать способ сгруппировать их и дифференцировать их.Ниже приведен пример таблицы того, с чем я работаю

sample table

На данный момент я вручную собираюсь и делаю каждый экземпляр уникальным.Ниже приведен желаемый результат

desired results table

Вот мой код, который вручную создает вышеуказанную таблицу:

SELECT DISTINCT acct_nbr,
CASE
    WHEN acct_nbr = 'account1' AND row_num BETWEEN 1 AND 3 THEN acct_nbr || 'a' --first instance
    WHEN acct_nbr = 'account1' AND row_num BETWEEN 4 AND 5 THEN acct_nbr || 'b' --second instance
    WHEN acct_nbr = 'account1' AND row_num BETWEEN 6 AND 7 THEN acct_nbr || 'c' --third instance
    ELSE acct_nbr
END AS acct_upt

Спасибо!

1 Ответ

0 голосов
/ 29 января 2019

Ну, 0 не является положительным.Но, в любом случае, каждая группа кажется идентифицированной по количеству неотрицательных значений после it.Однако, это производит нисходящее число, и вы хотите возрастающее число.Легко исправить, используя dense_rank().

Наконец, получение добавляемых букв не имеет смысла.Итак, я просто добавлю последнюю часть в отдельный столбец, и вы сможете выяснить, как объединить информацию с номером счета:

select acct_nbr,
       dense_rank() over (partition by acct_nbr order by grp desc) as modifier, 
       row_num, sys_dt, end_bal
from (select t.*,
             sum(case when end_bal >= 0 then 1 else 0 end) over (partition by acct_nbr order by sys_dt) as grp
      from t
     ) t;
...