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
我有一些线性月份的数据,只需要计算最近连续月份的数据。例如,如果一个人在 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