如何解决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 举报,一经查实,本站将立刻删除。