微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决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;

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。