T-SQL: обрабатывать последовательные периоды и считать по группам - PullRequest
2 голосов
/ 08 ноября 2019

Я имею дело с большой работой, чтобы найти максимальный период по ПОЛНЫМ месяцам зачисления в течение года (12-месячный период), что я сделал нормально, если у нас есть 2 периода. Просто застрял в конце при тестировании, если у меня 3+ периода. Данные ниже и картинка надежды предоставят всю информацию и легко начнутСпасибо всем. Это последний рабочий стол, который я получил в конце моего процесса, спасибо всем. Код ниже дает частично правильные результаты. Моя глобальная задача - найти максимальный период для каждого участника, поэтому некоторые поля просто для удобства работы.

/*  
DROP TABLE IF EXISTS #t;
CREATE TABLE #t ( Cust VARCHAR(10), mm INT, mm_prev INT, rn INT)
     INSERT #t values
         (123456, 1, NULL, 1), (123456, 2, 1, 2), 
         (123456, 4, 2, 3),   (123456, 5, 4, 4),  (123456, 6, 5, 5),
         (123456, 8, 6, 6),   (123456, 9, 8, 7),  (123456, 10, 9, 8), (123456, 11, 10, 9), (123456, 12, 11, 10),  
         (777 , 1, NULL, 1),(777 , 2, 1, 2) 

        SELECT   * from #t
        */


    select 
       Cust, MIN(mm) mmStart, MAX(mm) mmEnd, 
       CASE WHEN mm = rn THEN 'Grp A' ELSE 'Grp B' END Grp 
      ,COUNT(*) mm_count
    FROM #t
    WHERE 1=1 
      --mm - ISNULL(mm_prev,0) = 1     --check for conseq but we drop mm=6--> start of new period
      --   AND mm = rn        -- this brings only first group by mm
    GROUP BY Cust, CASE WHEN mm = rn THEN 'Grp A' ELSE 'Grp B' END
    ORDER BY 1,4
  • только на тот случай, если кто-то предпочитает иметь дело с исходными необработанными данными, которые я публикую. здесь также с некоторым разрывом и островками:

    CREATE TABLE #tr ( Cust varchar(10), ENR_START date, enr_END date, rn INT);      --        SELECT * FROM #t
    INSERT #tr VALUES  
     ('123456' ,    '2018-12-01',   '2019-3-1' ,    1),
     ('123456' ,    '2019-3-28',    '2019-6-30' ,   2),           -- 6 month  with 2 periods, island
     ('123456' ,    '2019-7-26',    '2019-8-20' ,   3),
     ('123456' ,    '2019-8-15',    '2019-12-31' ,  4),
      ('777' ,      '2018-11-4',   '2019-3-3' , 1) 
    select * from #tr 
    

Скриншот здесь:

enter image description here

1 Ответ

1 голос
/ 08 ноября 2019

смотрит на меня, ты этого хотел. Не совсем уверен, какова цель заявления case в вашем запросе

with cte as
(
    SELECT  *,
            grp = mm - rn
    from    #t
)
SELECT  Cust, MIN(mm) as mmStart, MAX(mm) as mmEnd, grp,
        count(*) as mm_count
FROM    cte
GROUP BY Cust, grp
order by Cust, mmStart
...