Добавить столбец для заполнения рейтинга для каждой группы - PullRequest
0 голосов
/ 23 сентября 2018

У меня есть данные истории с данными учетной записи, где статус активности учетной записи «Активен» или «Отменен». При повторном открытии учетной записи статус учетной записи становится «Активным», а позже может стать «Отмененным», как показано ниже.данные.Теперь я хотел бы различать данные каждый раз, когда учетная запись повторно открывается (с account_sub_number).

Я использовал следующий запрос:

select status,status_code,account_number,date, 
row_number() over (partition by account_number,status_code order by 
date  ) as Account_Sub_Number
 from schema.account where account_number= 1234
 order by date

Source_data:

Account Number  Status  Status Code Date
1234    Active  A   2017-12-04
1234    Active  A   2017-12-05
1234    Active  A   2017-12-06
1235    Active  A   2017-12-07
1234    Active  A   2018-03-02
1234    Cancelled   C   2018-03-03
1234    Cancelled   C   2018-03-04
1234    Cancelled   C   2018-05-10
1234    Cancelled   C   2018-05-11
1234    Active  A   2018-05-24
1234    Active  A   2018-05-25
1234    Active  A   2018-05-26
1234    Active  A   2018-05-27
1234    Cancelled   C   2018-05-28
1234    Cancelled   C   2018-06-15
1234    Cancelled   C   2018-06-16
1234    Cancelled   C   2018-06-17

Требуемый вывод:

    Account Number  Status  Status Code Date    Account Sub Number
1234    Active  A   2017-12-04  1
1234    Active  A   2017-12-05  1
1234    Active  A   2017-12-06  1
1235    Active  A   2017-12-07  1
1234    Active  A   2018-03-02  1
1234    Cancelled   C   2018-03-03  1
1234    Cancelled   C   2018-03-04  1
1234    Cancelled   C   2018-05-10  1
1234    Cancelled   C   2018-05-11  1
1234    Active  A   2018-05-24  2
1234    Active  A   2018-05-25  2
1234    Active  A   2018-05-26  2
1234    Active  A   2018-05-27  2
1234    Cancelled   C   2018-05-28  2
1234    Cancelled   C   2018-06-15  2
1234    Cancelled   C   2018-06-16  2
1234    Cancelled   C   2018-06-17  2

результат с моим запросом:

    Account Number  Status  Status Code Date    Account_sub_number
1234    Active  A   2017-12-04  1
1234    Active  A   2017-12-05  2
1234    Active  A   2017-12-06  3
1235    Active  A   2017-12-07  4
1234    Active  A   2018-03-02  5
1234    Active  A   2018-05-24  6
1234    Active  A   2018-05-25  7
1234    Active  A   2018-05-26  8
1234    Active  A   2018-05-27  9
1234    Cancelled   C   2018-03-03  1
1234    Cancelled   C   2018-03-04  2
1234    Cancelled   C   2018-05-10  3
1234    Cancelled   C   2018-05-11  4
1234    Cancelled   C   2018-05-28  5
1234    Cancelled   C   2018-06-15  6
1234    Cancelled   C   2018-06-16  7
1234    Cancelled   C   2018-06-17  8

Ответы [ 2 ]

0 голосов
/ 23 сентября 2018

В основном вам нужно определить группы.В этом случае вы можете пометить, где начинается группа, посмотрев на активный статус после неактивного статуса.

Затем совокупная сумма стартов группы - это номер, который вы ищете:

select a.*,
       sum(case when prev_status_code = status_code or
                     status <> 'Active'
                then 0 else 1
           end) over (partition by account_number order by date range between unbounded preceding and current row) as account_subnumber
from (select a.*,
             lag(status_code) over (partition by account_number order by date) as prev_status_code
      from schema.account a
     ) a
where account_number = 1234
order by date;
0 голосов
/ 23 сентября 2018

Получить статус в предыдущей строке (для каждой учетной записи, упорядоченной по дате) с помощью lag и использовать его для сравнения, чтобы установить группы с промежуточной суммой.

select t.*
,sum(case when prev_status is null or (prev_status='Cancelled' and status='Active') then 1 else 0 end) 
 over(partition by account_number order by date) as sub_account_number
from (select status,status_code,account_number,date,
      lag(status) over (partition by account_number order by date) as prev_status
      from schema.account 
      where account_number= 1234
     ) a
...