我对在 SQL 中工作很陌生,并且有一个差距和孤岛问题,我正试图获得一系列连续几个月的会员资格。任何成员都可能有多个成员资格,并且他们的成员资格可能存在差距或重叠。我的想法是按成员订购会员资格,并按月在该组内计划和反向工作,直到找到差距,然后指定会员资格的开始和结束日期。
这是我的数据样本:
Member YYYYMM Plan
1 201601 123
1 201602 123
2 201505 123
2 201506 123
2 201510 123
2 201511 123
2 201512 123
1 201510 456
1 201511 456
1 201512 456
1 201601 456
Run Code Online (Sandbox Code Playgroud)
上述数据将代表两个独立会员在不同时间跨度的相同/不同计划的会员资格。现在,我需要让它看起来更像这样:
Member YYYYMM_Begin YYYYMM_End Plan
1 201601 201602 123
2 201505 201506 123
2 201510 201512 123
1 201510 201601 456
Run Code Online (Sandbox Code Playgroud)
到目前为止,我有一个递归连接,它基于成员和计划进行分区,并按 YYYYMM 降序排列它们,这似乎有效。但是我一直在思考如何确定连续几个月的会员资格的开始和结束日期。
SELECT DISTINCT A.Member, A.Plan, A.YYYYMM, B.Rank
FROM Member_Hist A
JOIN (SELECT
MH.Member,
MH.Plan,
MH.YYYYMM,
RANK() OVER …Run Code Online (Sandbox Code Playgroud)