您可以使用下面的查询,以返回其连续InstallmentID
数的连续记录的岛屿:
;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
如果你想只有3记录了每个岛的,然后您可以使用ROW_NUMBER
和PARTITION BY cnt
条款来提取该岛的前3条记录。
说明:第一CTE,CTE_Group
的查询,以便识别具有预定时间范围()内的连续InstallmentID
号码连续记录使用“行号特技之间差”。从CTE_Group
输出:
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
第二CTE,CTE_Count
的查询,以便计算每个岛的人口使用COUNT() OVER()
。从CTE_Count
输出:
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
使用CTE_Count
,我们可以很容易地筛选出属于具有2
以下的人口的岛屿记录。
Demo here
6,6,7 - 连续的? – DarkKnight
对不起,纠正。 6,7,8 –
如果您有3,4,6,7,8,9,它应该返回什么? – DarkKnight