【问题标题】:SQL Server - Resetting row count within the windowSQL Server - 重置窗口内的行数
【发布时间】:2016-02-24 08:54:53
【问题描述】:

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

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

在 monthcount 列中,您可以看到 row_number 不识别他们不是会员的月份,一旦他们再次成为会员,它就会开始计数。我不需要将 8 显示为最后一个月的计数,而是需要它为 6,并且计数在 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

任何关于如何在会员资格中断后重置我的计数的想法将不胜感激!也可以在没有窗口/分区的情况下执行此操作。 (请不要使用游标。要处理 1600 万条记录)

【问题讨论】:

  • 非成员行的monthcount 是什么?
  • 你使用的sql server是什么版本的?
  • 他们不是会员的任何月份都只是 1。

标签: sql-server row-number


【解决方案1】:

使用ROW_NUMBERs 的差异:

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**

【讨论】:

  • 效果很好,菲利克斯!谢谢!
  • 很高兴能帮上忙。如果它解决了您的问题,请接受此答案。
猜你喜欢
  • 2018-01-03
  • 1970-01-01
  • 2016-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-01
  • 1970-01-01
相关资源
最近更新 更多