在SQL Server 2012中选择连续ID

在SQL Server 2012中选择连续ID,sql,sql-server-2012,Sql,Sql Server 2012,我有一张这样的桌子 ID Installment ID DateDue ------------------------------------------------------------ 000000000008 29 2017-03-15 00:00:00.000 000000000008 30 2017-04-15 00:00:00.000 00000

我有一张这样的桌子

ID              Installment ID       DateDue 
------------------------------------------------------------    
000000000008    29                   2017-03-15 00:00:00.000 
000000000008    30                   2017-04-15 00:00:00.000 
000000000008    32                   2017-06-15 00:00:00.000 
000000000008    33                   2017-07-15 00:00:00.000 
000000000008    34                   2017-08-15 00:00:00.000
我需要的是一个select查询,它只返回3次成功的连续分期的数据,所以在本例中是32,33,34,在特定的日期范围之间

假设在另一个表31中填充了失败的数据

因此,我希望返回序列号、分期付款ID。

您可以使用SqlServer 2012中提供的前置和后置功能,并执行类似操作

ID              Installment ID       DateDue 
------------------------------------------------------------    
000000000008    29                   2017-03-15 00:00:00.000 
000000000008    30                   2017-04-15 00:00:00.000 
000000000008    32                   2017-06-15 00:00:00.000 
000000000008    33                   2017-07-15 00:00:00.000 
000000000008    34                   2017-08-15 00:00:00.000

可以使用以下查询返回具有连续InstallmentID号的连续记录孤岛:

如果您只希望每个岛中有3条记录,那么可以使用ROW_NUMBER和PARTITION BY cnt子句来提取岛的前3条记录

说明:第一个CTE(CTE_组)的查询使用“行号之间的差异技巧”来识别具有预定义日期范围@startDate-@endDate内连续InstallmentID号的连续记录

CTE_组的输出:

第二个CTE(CTE_Count)的查询使用Count OVER来计算每个岛屿的人口

CTE_计数的输出:

使用CTE_计数,我们可以轻松筛选出属于人口为2或更少岛屿的记录


6,6,7-连续?抱歉,已更正。6,7,8如果您有定义日期在x和x之间的3,4,6,7,8,9?,最多3条ID为和分期付款ID的记录,它应该返回什么。
;WITH CTE_Group AS (
   SELECT ID,
          InstallmentID,
          DateDue,
          ROW_NUMBER() OVER (PARTITION BY ID 
                             ORDER BY DateDue) - InstallmentID AS grp
   FROM mytable
   WHERE DateDue BETWEEN @startDate AND @endDate
), CTE_Count AS (
   SELECT ID, InstallmentID, DateDue,
          COUNT(*) OVER (PARTITION BY ID, grp) AS cnt
   FROM CTE_Group
)
SELECT ID, InstallmentID, DateDue
FROM CTE_Count
WHERE cnt >= 3
ID  InstallmentID   DateDue     grp
------------------------------------
8   29              2017-03-15  -28
8   30              2017-04-15  -28
8   32              2017-06-15  -29
8   33              2017-07-15  -29
8   34              2017-08-15  -29
ID  InstallmentID   DateDue     Cnt
-----------------------------------
8   32              2017-06-15  3
8   33              2017-07-15  3
8   34              2017-08-15  3
8   29              2017-03-15  2
8   30              2017-04-15  2