Вы можете использовать следующий запрос, чтобы вернуть острова последовательных записей, имеющих последовательные 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
Если вы хотите только три записи из каждого острова, а затем вы можете использовать ROW_NUMBER
с предложением PARTITION BY cnt
, чтобы извлечь первые 3 записи острова.
Объяснение: Запрос первого КТР, CTE_Group
, использует «разницу между номерами строк трюком» с целью выявления последовательных записей, имеющих последовательные номера InstallmentID
в пределах заранее определенного диапазона дат (@startDate - @endDate
).
Выход из 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_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