Создайте индикатор, используя первую запись каждой политики и последующих транзакций в течение 90 дней с оригинала - PullRequest
0 голосов
/ 01 февраля 2020

TL / DR. Существует много типов транзакций для каждой политики, все начинаются с «N», поскольку это новая бизнес-транзакция. R = Обновление и обычно следуют каждый год. «C» означает, что политика была отменена, а «U» означает, что она была восстановлена, что отменяет отмену. Мне нужно знать, отменила ли (0) или в течение 90 дней после регистрации N запись (0) или не была отменена или отменена отмена, которая также произошла в этом 90-дневном окне (1).

ОЧЕНЬ похож на этот вопрос: SQL Сервер: Найти записи с ближайшей датой к текущей дате на основе условий

Мои данные выглядят так, для 4 политик (ID ).

Trs | Id | Effective_Dt  | Expiration_DT
N      |   01      |   2018-01-08 | 2018-01-23
C      |   01      |   2018-01-23 | 2018-02-03 
U      |   01      |   2018-02-03 | 2019-01-08 
R      |   01      |   2019-01-08 | 2020-01-08
R      |   01      |   2020-01-08 | 2021-01-08
N      |   02      |   2019-10-10 | 2019-12-01
C      |   02      |   2019-12-01 | NULL
N      |   03      |   2017-06-10 | 2017-11-01
C      |   03      |   2017-11-01 | NULL
N      |   04      |   2017-06-10 |   2017-07-01
C      |   04      |   2017-07-01 |   2017-11-01
U      |   04      |   2017-11-01 |   NULL

каждая запись - это новая транзакция в политике, где N = новая деловая запись, C = отменено, U = восстановлено (отменить отмену), R = возобновление

Срок действия обычно составляет 1 год с даты вступления в силу продлений, но в случае отмены даты истечения срока действия является датой вступления в силу новой транзакции.

Для этого вопроса я специально занимаюсь транзакциями N, C и U; но я включил R, чтобы вы получили представление о том, как выглядят данные. Что мне нужно знать, так это то, какие политики (0 в случае отмены или 1 индикатор в случае сохранения) имели тип транзакции C в течение 90 дней с момента их типа транзакции N ... и НЕ следовали U в течение того же периода.

Пример / результат:

Id      |   Retained      
01      |     1    
02      |     0 
03      |     1   
04      |     0  

Подробности:

  • Для политики 01 N наступает 2018-01-08. 90 дней с этого будет 2018-04-08. Запись C 2018-01-23 была отменена 2018-02-03; который попадает в диапазон 90 дней. Таким образом, эта политика получит 1 за сохранение.

  • Политика 02 N происходит в 2019-10-10. 90 дней с этого будет 2020-01-08. Запись C 2019-12-01 не была отменена. Таким образом, эта политика получит 0 за отмену.

  • Политика 03: N происходит в 2017-06-10. Запись C на 2017-11-01 произошла после 90 дней. Таким образом, для этой политики будет сохранено значение 1.

  • Политика 04: N происходит в 2017-06-10. Запись C в 2017-07-01 произошла до 90 дней, а затем была отменена в 2017-11-01-- но это после 90 дней. Таким образом, эта политика получит 0.

Я надеюсь, что это не слишком плохо задано ... но в основном берется дата транзакции N для каждой политики, сравнивая ее с последней U или C транзакция, произошедшая в течение 90 дней после N. Если это C, 0, иначе 1.

Ответы [ 3 ]

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

Вы можете использовать оконные функции в два этапа: сначала получить дату первого 'N' для политики с окном min(), затем выполнить условное last_value() для восстановления типа последнего U или C транзакция.

select distinct 
    id,
    case 
        last_value(
            case 
                when coalesce(expiration_dt, effective_dt) <= dateadd(day, 90, n_effective_dt)
                and trs in ('C', 'U')
            then trs
            end
        ) over(partition by id order by effective_dt)
        when 'U' then 1
        when 'C' then 0
    end retained
from (
    select
        t.*,
        min(case when trs = 'N' then effective_dt end) over(partition by id) n_effective_dt
    from mytable t
) t
0 голосов
/ 07 февраля 2020

Я понял свой ответ ... создал CTE:

 NB_CANCELS AS (
 SELECT 
 CONCAT(POL_SYMBOL_CD,POL_NBR) NB_CANCEL_ID
,EFFECTIVE_DT
,EFFECTIVE_TYPE_CD
,HISTORY_VLD_NBR
,PLN_EXP_DT
,EXPIRATION_TYPE_CD
,EXPIRATION_DT


 FROM  (SELECT *,(SELECT DATEADD(D,90,OGN_EFF_DT) -- Find NB record and add 90 Days
                FROM  Exceed_Reporting.XCD.POLICY_TAB SUB
               WHERE  SUB.EFFECTIVE_TYPE_CD='N' --- NB only 
               AND    (SUB.EXPIRATION_TYPE_CD!='7' OR EXPIRATION_TYPE_CD IS NULL)
               AND    SUB.POLICY_ID           = PT.POLICY_ID
               AND    SUB.QUOTE_SEQUENCE_NBR   = 0
              ) NB90DAY
              FROM Exceed_Reporting.XCD.POLICY_TAB pt) PT1
 WHERE EFFECTIVE_TYPE_CD in ('5','3','s','p') -- Any cancel status
AND (EXPIRATION_TYPE_CD!='7' OR EXPIRATION_TYPE_CD IS NULL)
AND POL_SYMBOL_CD in ('HO','DP')
AND RIGHT(policy_ID,4)!='SAVE' 
AND STATUS_CD='A' 
AND pt1.EFFECTIVE_DT<=NB90DAY
AND (pt1.EXPIRATION_DT>=NB90DAY
OR PT1.EXPIRATION_DT IS NULL)
,

, затем в моем базовом запросе создал следующую инструкцию Case:

 , CASE     WHEN pt.EFFECTIVE_TYPE_CD!='N' THEN NULL
            WHEN CONCAT(PT.POL_SYMBOL_CD,PT.POL_NBR) IN (SELECT NB.NB_CANCEL_ID FROM NB_CANCELS nb)
            THEN 0  
            else 1 
END AS NB_90D_PERSISTENCE  



        FROM (SELECT *,DATEADD(dd,90,EFFECTIVE_DT) NB_90DAY
                    FROM POLICY_TAB 
                where    EFFECTIVE_TYPE_CD in ('N','R')

                ) PT
0 голосов
/ 01 февраля 2020

Попробуйте, если у вас работает

  Select id,
   max(Case when  trs='C' and
      Expiration_DT<=min(Effective_Dt) 
      +90
    Then 1 else 0 end) as indicator
    from table  
   group by id 
...