【问题标题】:Finding subscriber counts where End Date and Start Date are in same month查找结束日期和开始日期在同一个月的订阅者数量
【发布时间】:2019-07-24 17:04:03
【问题描述】:

我想获取在过去 12 个月内终止原因为“xxx”的同一个月内终止和重新注册的订阅者的数量。

在上述示例中,订阅者“1245”因“xxx”原因被终止,但在同一个月重新注册。我想统计过去 n 个月中这种情况每月发生的次数。

我尝试了下面的代码来获取 PersonID,但在一个月内无法获取计数。

SELECT DISTINCT PersonID FROM Membership A

INNER JOIN (SELECT StartYrMo FROM Membership) B

ON A.EndYrMo = B.StartYrMo

WHERE A.TermReason = 'xxx'

ORDER BY PersonID

编辑还有更多内容。我想要所有连续至少 6 个月这样做的 PersonId。含义:人“A”在 201901 年因“xxx”原因被终止。“A”在 201902 年至 201908 年因同样的“xxx”原因再次终止,至少 6 个月。我想要所有这样做的人的 ID。

【问题讨论】:

  • 假设这是 SQL Server。对于初学者,您需要一个GROUP BY。添加 JOIN AND A.PersonID = B.PersonID

标签: sql sql-server


【解决方案1】:

应该这样做:

SELECT DISTINCT A.PersonID FROM Membership A

INNER JOIN Membership B ON A.PersonID = B.PersonID
INNER JOIN Membership C ON A.PersonID = C.PersonID
INNER JOIN Membership D ON A.PersonID = D.PersonID

WHERE A.TermReason = 'xxx'
AND   B.TermReason = 'xxx'
AND   C.TermReason = 'xxx'
AND   D.TermReason = 'xxx'

AND   B.StartMonth = A.EndMonth
-- following assumes minimum date in your dataset is '201101'.
-- '+ 89' returns '201201' instead of '201113' when EndMonth is '201112'.
AND   C.StartMonth = CASE WHEN A.EndMonth IN ('201112', '201212', '201312', '201412', '201512', '201612', '201712', '201812', '201912')
                     THEN A.EndMonth + 89 ELSE A.EndMonth + 1 END
AND   D.StartMonth = CASE WHEN A.EndMonth IN ('201112', '201212', '201312', '201412', '201512', '201612', '201712', '201812', '201912', '201111', '201211', '201311', '201411', '201511', '201611', '201711', '201811', '201911')
                     THEN A.EndMonth + 90 ELSE A.EndMonth + 2 END
-- repeat for additional months as needed.

ORDER BY PersonID

为减少冗余,此代码仅查看连续 3 个月。如果它没有返回任何结果,那么您不必担心为其他月份编写额外的代码行(如果它是一次性请求)。因为如果连续3个月没有人,那么连续6个月也没有人。我希望这会有所帮助:)

【讨论】:

    【解决方案2】:

    要获得重新订阅的人:

    select m2.PersonID, m2.StartMonth as ResubscriptionMonth
                from Membership m1 inner join Membership m2
                on m1.PersonID = m2.PersonID
                where m1.TermReason = 'xxx' and m1.EndMonth = m2.StartMonth
    

    按月获取数字:

    select Resubscibtions.ResubscriptionMonth, Count(*)
    from (
            select m2.PersonID, m2.StartMonth as ResubscriptionMonth
            from Membership m1 inner join Membership m2
            on m1.PersonID = m2.PersonID
            where m1.TermReason = 'xxx' and m1.EndMonth = m2.StartMonth) as Resubscibtions 
    group by Resubscibtions.ResubscriptionMonth
    

    【讨论】:

    • 第一部分完美。由于我的数据存在方式,只需将 DISTINCT 添加到 PersonID 即可。很快就会回到第二部分。谢谢!
    • 如果这是您正在寻找的答案,请将其标记为已回答:) 如果您有任何其他问题,请在评论中告诉我。
    • 谢谢!杰克。我编辑了我的问题。感谢您的帮助,同时我也在努力!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-17
    • 2019-02-25
    • 1970-01-01
    • 2020-12-17
    • 1970-01-01
    相关资源
    最近更新 更多