SQL 服务器 - 重置 window 中的行数

SQL Server - Resetting row count within the window

我有一些线性月份的数据,只需要计算最近连续月份的数据。例如,如果一个人在 2014 年的前两个月是健身俱乐部的会员,然后退出了 4 个月,然后又注册了剩下的 6 个月,我需要证明他们已经连续 6 个月成为会员。

这是我用来尝试获取行数的查询和 table 数据。 YearMo 跟踪可能的年份和月份列表。 ismember 列跟踪他们是否是成员 - 1 表示他们是成员,nc 后跟 yearmo 值 (nc201403) 表示他们不是成员的月份。

在 monthcount 列中,您可以看到 row_number 无法识别他们不是会员的月份,一旦他们再次成为会员,它就会开始计数。我需要它是 6,而不是显示 8 作为最后的月份计数,并且计数在 201407(2014 年 7 月)重新开始。

SELECT member_id, YearMo, ismember, 
ROW_NUMBER() OVER(PARTITION BY member_id, ismember ORDER BY members.yearmo ) AS 'monthcount'
FROM #temp_members WHERE member_id = '12345678' ORDER BY yearmo 


member_id   YearMo  ismember    monthcount
12345678    201401  1               1
12345678    201402  1               2
12345678    201403  nm201403        1
12345678    201404  nm201404        1
12345678    201405  nm201405        1
12345678    201406  nm201406        1
12345678    201407  1           3
12345678    201408  1           4
12345678    201409  1           5
12345678    201410  1           6
12345678    201411  1           7
12345678    201412  1           8

如有任何关于如何在会员资格中断后重置我的计数的想法,我们将不胜感激!也可以接受没有 window /partition 的方法。 (请不要游标。要处理一千六百万条记录)

使用 ROW_NUMBER 秒的差异:

WITH Cte AS(
    SELECT *,
        rn = ROW_NUMBER() OVER(PARTITION BY member_id ORDER BY YearMo)
            - ROW_NUMBER() OVER(PARTITION BY member_id, CASE WHEN ismember <> '1' THEN 0 ELSE 1 END ORDER BY YearMo)
    FROM #temp_members
)
SELECT
    member_id, 
    YearMo,
    ismember,
    monthcount = ROW_NUMBER() OVER(PARTITION BY member_id, rn, ismember ORDER BY YearMo)
FROM Cte ORDER BY member_id, YearMo

**TRY IT HERE**