首页 > 解决方案 > 在 SQL Server 2008 中遇到值 1 时重置计数的正确语法是什么?

问题描述

rank()在 SQL Server 2008(无Lag功能)中满足值 1 时如何重置?

从代码中可以看出,“Column_Reference”列不会产生我想要的结果。知道如何解决这个问题吗?

case when 
         (case when Datediff(day, s2.DutyStartDateLocal, s1.DutyStartDateLocal) = 1 then 1
         else 0
         end) = 0 then 1--+ (-1*row_number() OVER (PARTITION BY s1.CREWID  order by s1.CREWID,s1.DutyStartDateLocal))
     ELSE 
      row_number() OVER (PARTITION BY s1.CREWID order by s1.CREWID,s1.DutyStartDateLocal)
         END as Column_Reference
Current result of column_reference    Ideal result
--------------------------------------------------
              1                           1
              2                           2
              3                           3
              4                           4
              1                           1
              6                           2
              7                           3
              8                           4
              9                           5
              1                           1
             11                           2
             12                           3
             13                           4
             14                           5

标签: sqlsql-server-2008

解决方案


升级到更新版本的 SQL Server!至少会支持!

您想将组分配给范围,然后使用row_number(). 不幸的是,不允许累积总和,但您可以使用apply.

我无法关注您关心的列和表。有一个排序列非常重要——我将调用它,DutyStartDateLocal但可以是多个列。

结构是:

select t.*,
       row_number() over (partition by t.crewid, g.grp order by DutyStartDateLocal) as seqnum
from t cross apply
     (select count(*) as grp
      from t t2
      where t2.crewid = t.crewid and 
            t2.DutyStartDateLocal <= t.DutyStartDateLocal  and
            t2.colref = 0
     ) g ;

推荐阅读