【发布时间】:2021-05-29 08:33:40
【问题描述】:
这个问题我很难写出来。
我有一张如下表:
| Date | ItemNumber | FlagA | FlagB |
|---|---|---|---|
| 2020-01-01 | 101 | Y | N |
| 2020-01-02 | 101 | N | N |
| 2020-01-03 | 101 | Y | N |
| 2020-01-04 | 101 | Y | N |
| 2020-01-05 | 101 | Y | Y |
| 2020-01-01 | 102 | Y | N |
| 2020-01-02 | 102 | N | N |
| 2020-01-03 | 102 | N | N |
| 2020-01-04 | 102 | Y | Y |
我的目标是计算每个 ItemNumber 的 FlagA = Y 的连续日期,包括和之前的 FlagB = Y 的日期。表中每个 ItemNumber 的最后日期将始终具有 FlagB = Y。
我正在尝试通过添加一个额外的列来实现这一点:
| Date | ItemNumber | FlagA | FlagB | RunningCount |
|---|---|---|---|---|
| 2020-01-01 | 101 | Y | N | 0 |
| 2020-01-02 | 101 | N | N | 0 |
| 2020-01-03 | 101 | Y | N | 1 |
| 2020-01-04 | 101 | Y | N | 2 |
| 2020-01-05 | 101 | Y | Y | 3 |
| 2020-01-01 | 102 | Y | N | 0 |
| 2020-01-02 | 102 | N | N | 0 |
| 2020-01-03 | 102 | N | N | 0 |
| 2020-01-04 | 102 | Y | Y | 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 计数的查询。
任何建议将不胜感激。提前谢谢你。
【问题讨论】:
标签: sql sql-server sql-server-2012