首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >T-SQL:处理结果周期并按组计数。

T-SQL:处理结果周期并按组计数。
EN

Stack Overflow用户
提问于 2019-11-08 03:16:49
回答 1查看 71关注 0票数 2

我处理的大工作是在一年内(12个月)内,在入学后的整整一个月内找到最大期限,如果我们有两期的话,我做得不错。只是在测试我是否有3+周期的时候被困在了最后。下面的数据和图片希望将提供所有的信息和容易开始。多亏了所有人。这是我在过程结束时得到的最后一张工作表,谢谢大家。下面的代码会产生部分正确的结果。我的全局任务为每个成员找到了最大时间段,所以有些字段只是为了方便地工作。

代码语言:javascript
复制
/*  
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

  • 只是为了解决这个问题,如果有人更喜欢处理原始数据,我也在这里发布了一些空白和岛屿:

创建表#tr ( Cust varchar(10),ENR_START date,enr_END date,rn INT);-从#t中选择*插入#tr值('123456‘,'2018-12-01',’2019-3‘’,1),('123456‘,'2019-3-28','2019-6-30’,2),-6个月,2个周期,岛屿('123456‘,'2019-7-26',’2019-8‘-20’,3),(“123456”,'2019-8-15','2019-12-31‘,4),('777’,'2018-11-4','2019-3-3‘,1)从#tr 中选择*

截图在这里:

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-11-08 03:38:44

在我看来你想要这个。不太确定查询中case语句的用途是什么

代码语言:javascript
复制
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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58759865

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档