T-SQL:处理结果期间并按组计数

问题描述 投票:1回答:1

我要完成一项艰巨的工作,以在一年内(12个月为期)通过完整的注册月数来找到最长期限,如果我们有两个时期,我就可以了。在测试我是否有3个以上期间时,最后被卡住了。下面的数据和图片希望将为您提供所有信息和轻松入门。谢谢大家。这是我在流程结束时得到的最终工作表,谢谢。下面的代码产生partially正确的结果。我的全局任务是为每个成员找到最长期限,因此某些字段只是为了方便工作。

/*  
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

sql-server tsql period
1个回答
0
投票

在我看来,您想要这个。不太确定查询中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
© www.soinside.com 2019 - 2024. All rights reserved.