在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