Как вы сегментируете различные «периоды политики» по группам в SQL (чтобы впоследствии рассчитать промежуточную сумму за «период политики»)? - PullRequest
0 голосов
/ 07 февраля 2020

Я понимаю, как рассчитать промежуточную сумму в SQL (DB2), используя функцию analyti c. Однако мне нужно НАЧАТЬ промежуточный итог а) в разных точках (строках) на группу и б) перезапускать промежуточный итог каждый «период политики». Например, если я хочу рассчитать текущую общую стоимость на члена в месяц за период действия политики, для групп, которые обновляются 1 января каждого года, это просто, так как я могу разделить на год & group_id (& order by месяц / год) для перезапуска промежуточного итога за период политики (так как период политики эквивалентен календарному году).

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

Если я смогу создать столбец, который сегментирует периоды политики по группам, тогда я могу разделить по group_id, периоду политики и порядку по месяцам / годам, я считаю. Например, для определенной группы, которая обновляется в июле каждого года, столбец policy_period указывает «1» для 201207-201306, «2» для 201307-201406 и т. Д. c. (По сути, это количество периодов политики, которые у меня есть в качестве обучающих данных для моего режима ML.)

Может ли кто-нибудь помочь с созданием вышеупомянутого столбца? Я пытаюсь избежать жесткого кодирования этого с многочисленными заявлениями случая, но это может быть путь, который я должен выбрать. Есть какие-нибудь идеи?

Кроме того, я пытался мыслить нестандартно и думал, что я мог бы потенциально преобразовать июль, чтобы читать его как январь, но это также может быть слишком много времени, так как группы могут возобновить свою политику в любой из 12 месяцев года. У меня также есть двоичный столбец, который указывает 1, если строка является месяцем обновления для данной группы, иначе 0, но это не помогает с разбиением / упорядочением в функции analyti c для вычисления промежуточного итога.

Пример таблицы текущих данных:

GRP_ID  YR_MO    MONTHLY_COST  NEXT_RENEWAL_YR_MO
001     201201   10            202007       
001     201202   10            202007 
001     201203   10            202007
001     201204   10            202007
001     201205   10            202007       
001     201206   10            202007 
001     201207   10            202007    
001     201208   10            202007
001     201209   10            202007              
001     201210   10            202007             
001     201211   10            202007             
001     201212   10            202007           
001     201301   10            202007 
001     201302   10            202007             
001     201303   10            202007              
001     201304   10            202007        
001     201305   10            202007           
001     201306   10            202007          
001     201307   10            202007          
001     201308   10            202007           

Пример таблицы желаемых результатов:

GRP_ID  YR_MO    POLICY_PERIOD  MONTHLY_COST   RUN_TOT_AMT_PER_PLCY_PRD
001     201201   1              10             10
001     201202   1              10             20
001     201203   1              10             30
001     201204   1              10             40
001     201205   1              10             50
001     201206   1              10             60
001     201207   2              10             10
001     201208   2              10             20
001     201209   2              10             30
001     201210   2              10             40
001     201211   2              10             50
001     201212   2              10             60
001     201301   2              10             70
001     201302   2              10             80
001     201303   2              10             90
001     201304   2              10             100
001     201305   2              10             110
001     201306   2              10             120
001     201307   3              10             10
001     201308   3              10             20

Выше приведен только один пример. Очевидно, что разделение по group_id является простым, но как я могу a) создать столбец периода политики, чтобы затем b) запустить итоговую сумму за период политики для группы?

Столбец периода политики будет связан с использованием densityrank () , но начинаются и возобновляются с седьмого месяца каждого года для определенных групп, которые обновляются в июле каждого года, по сравнению с третьим месяцем каждого года для других групп, возобновляемых в марте каждого года, и т. д. c. вот в чем проблема.

Я имею в виду:

CASE
    WHEN RIGHT(NEXT_RENEWAL_YR_MO,2) = RIGHT(YR_MO,2) THEN 1
    ELSE 0
 END AS RESTART_RUN_TOT_HERE

... но я продолжаю зацикливаться на том, как заставить промежуточную сумму фактически перезапускать при каждом последующем «1» на группу, когда остальные строки обозначают «0».

1 Ответ

1 голос
/ 07 февраля 2020

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

/*
WITH TAB (GRP_ID, YR_MO, MONTHLY_COST, NEXT_RENEWAL_YR_MO) AS 
(
VALUES 
  ('001', '201202', 10, '202007')
, ('001', '201201', 10, '202007')
, ('001', '201203', 10, '202007')
, ('001', '201204', 10, '202007')
, ('001', '201205', 10, '202007')
, ('001', '201206', 10, '202007')
, ('001', '201207', 10, '202007')
, ('001', '201208', 10, '202007')
, ('001', '201209', 10, '202007')
, ('001', '201210', 10, '202007')
, ('001', '201211', 10, '202007')
, ('001', '201212', 10, '202007')
, ('001', '201301', 10, '202007')
, ('001', '201302', 10, '202007')
, ('001', '201303', 10, '202007')
, ('001', '201304', 10, '202007')
, ('001', '201305', 10, '202007')
, ('001', '201306', 10, '202007')
, ('001', '201307', 10, '202007')
, ('001', '201308', 10, '202007')
)
*/
SELECT 
  GRP_ID, YR_MO
, SUM(CASE WHEN RIGHT(YR_MO, 2) = RIGHT(NEXT_RENEWAL_YR_MO, 2) THEN 1 ELSE 0 END) OVER (PARTITION BY GRP_ID ORDER BY YR_MO) + 1 AS POLICY_PERIOD
, MONTHLY_COST
, SUM(MONTHLY_COST) OVER 
(
  PARTITION BY 
  GRP_ID
, SUM(CASE WHEN RIGHT(YR_MO, 2) = RIGHT(NEXT_RENEWAL_YR_MO, 2) THEN 1 ELSE 0 END) OVER (PARTITION BY GRP_ID ORDER BY YR_MO)
  ORDER BY YR_MO
) AS RUN_TOT_AMT_PER_PLCY_PRD
FROM TAB;

db <> пример скрипты .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...