SQL Server 根据值计算连续的前行

问题描述

这对我来说很难写出来。

我有一张如下表:

日期 商品编号 FlagA FlagB
2020-01-01 101 N
2020-01-02 101 N N
2020-01-03 101 N
2020-01-04 101 N
2020-01-05 101
2020-01-01 102 N
2020-01-02 102 N N
2020-01-03 102 N N
2020-01-04 102

我的目标是计算 FlagA = Y 的连续日期,包括每个 ItemNumber 的 FlagB = Y 的日期。表中每个 ItemNumber 的最后日期将始终具有 FlagB = Y。

我试图通过添加一个额外的列来实现这一点:

日期 商品编号 FlagA FlagB RunningCount
2020-01-01 101 N 0
2020-01-02 101 N N 0
2020-01-03 101 N 1
2020-01-04 101 N 2
2020-01-05 101 3
2020-01-01 102 N 0
2020-01-02 102 N N 0
2020-01-03 102 N N 0
2020-01-04 102 1

我使用的是 sql Server 2012,但对窗口函数没有很多经验。我尝试了几件事,包括

COUNT(CASE WHEN [FLagB] = 'Y' THEN 1 ELSE 0 END) 
              over (partition by [ItemNumber],[FlagB] 
                   order by [Date] ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS [RunningCount]

和:

COUNT(CASE WHEN [FLagB] = 'Y' THEN [ItemNumber] END) 
              over (PARTITION BY [ItemNumber] 
                   order by [Date] ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS [RunningCount]

但这些没有得到正确的结果。

可能有更好的方法解决这个问题 - 我不需要将新列添加到表中,我只需要一个提供每个 ItemNumber 计数的查询

任何建议将不胜感激。提前致谢。

解决方法

您似乎想要为最近的不间断序列枚举 flagA = Y。那将是:

select t.*,(case when grp = 0 and flagA = 'Y'
             then row_number() over (partition by grp,flagA order by date) 
             else 0
        end) as runningCount
from (select t.*,sum(case when flagA = 'N' then 1 else 0 end) over (partition by itemNumber order by date desc) as grp
      from t
     ) t;