SQL Server - 有条件地增加计数器

标签 sql sql-server

我想要做的是为连续的日期范围创建分组序列。获取以下示例数据:

Person|BeginDate |EndDate
A     |1/1/2015  |1/31/2015
A     |2/1/2015  |2/28/2015
A     |4/1/2015  |4/30/2015
A     |5/1/2015  |5/31/2015
B     |1/1/2015  |1/30/2015
B     |8/1/2015  |8/30/2015
B     |9/1/2015  |9/30/2015

如果当前行中的 BeginDate 距上一行中的 EndDate >1 天,则将计数器增加 1,否则分配计数器的当前值。排序如下:

Person|BeginDate |EndDate  |Sequence
A     |1/1/2015  |1/31/2015|1
A     |2/1/2015  |2/28/2015|1
A     |4/1/2015  |4/30/2015|2
A     |5/1/2015  |5/31/2015|2
B     |1/1/2015  |1/30/2015|1
B     |8/1/2015  |8/30/2015|2
B     |9/1/2015  |9/30/2015|2

为每个人进行分区和重置。

供您测试:

 CREATE TABLE ##SequencingTest(
 Person char(1)
,BeginDate date
,EndDate date)

INSERT INTO ##SequencingTest
VALUES
('A','1/1/2015','1/31/2015')
,('A','2/1/2015','2/28/2015')
,('A','4/1/2015','4/30/2015')
,('A','5/1/2015','5/31/2015')
,('B','1/1/2015','1/30/2015')
,('B','8/15/2015','8/31/2015')
,('B','9/1/2015','9/30/2015')

最佳答案

您可以使用 lag() 和累积总和来完成此操作:

select t.*,
       sum(flag) over (partition by person order by begindate) as sequence
from (select t.*,
             (case when datediff(day, lag(endDate) over (partition by person order by begindate), begindate) < 2
                   then 0
                   else 1
              end) as flag
      from t
     ) t;

关于SQL Server - 有条件地增加计数器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35343404/

相关文章:

mysql - 根据特定表字段连接两个表

sql - 哈希主键postgresql

sql-server - 使用 Guid 维护数据库中的键与使用整数的另一个键之间的数据库关系

sql-server - 为什么 Visual Studio 启动 localdb 以及如何停止它?

c# - SQL参数异常: The SqlParameter is already contained by another SqlParameterCollection

sql - 在 postgres 中,是否可以优化 UNION 的 VIEW

sql - 创建此数据库的最佳方法是什么

c# - 在 Entity Framework Core 2.0 中执行 SQL 命令删除表中的所有数据

sql-server - SQL Server 中的计算列

c# - 通过创建日期时间将 null 传递到 sql server 2012 日期时间的问题?我的存储过程的变量