T10=]:处理连续周期并按组计数
T-SQL: process consequtive periods and count by group
我处理了一项艰巨的工作,通过一年内注册的完整月份(12 个月)找到最大期限,如果我们有 2 个期限,我做得很好。在测试我是否有 3 个以上的经期时,最后卡住了。下面的数据和图片希望将提供所有信息并轻松启动。谢谢大家。这是最后的工作 table 我在我的过程结束时得到了,谢谢大家。下面的代码产生 部分 正确的结果。我的全局任务为每个成员找到 MAX period,所以有些字段只是为了方便工作。
/*
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
截图在这里:
在我看来,你想要这个。不太确定查询中 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
我处理了一项艰巨的工作,通过一年内注册的完整月份(12 个月)找到最大期限,如果我们有 2 个期限,我做得很好。在测试我是否有 3 个以上的经期时,最后卡住了。下面的数据和图片希望将提供所有信息并轻松启动。谢谢大家。这是最后的工作 table 我在我的过程结束时得到了,谢谢大家。下面的代码产生 部分 正确的结果。我的全局任务为每个成员找到 MAX period,所以有些字段只是为了方便工作。
/*
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
截图在这里:
在我看来,你想要这个。不太确定查询中 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