【问题标题】:SQL Server Count Consecutive Preceding Rows based on ValuesSQL Server 根据值计算连续的前行
【发布时间】: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


    【解决方案1】:

    您似乎希望枚举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;
    

    【讨论】:

    • 感谢您的回复,不幸的是这对我不起作用。尝试将 case 语句的一部分别名为“seqnum”时会引发错误。删除它会为第一个 ItemNumber 的第一个日期到最后一个日期添加从 1 开始的计数,然后为其余的 ItemNumbers 和日期返回 0。
    • @sprVUHL 。 . .我删除了。
    猜你喜欢
    • 2022-08-18
    • 1970-01-01
    • 1970-01-01
    • 2016-01-10
    • 2021-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多