Мое решение основано на данных примера, которые вы предоставили вместе с формулой Excel.
-- easily consumable sample data
DECLARE @tbl_events TABLE (PersonId int, [date] date)
INSERT @tbl_events VALUES
(1,'20150330'),(1,'20150422'),(1,'20150630'),(2,'20160718'),(2,'20161209'),(2,'20170428'),
(3,'20141001'),(3,'20161128'),(3,'20161128'),(3,'20170116'),(4,'20170413'),(4,'20170509');
-- Solution
WITH groupings AS
(
SELECT
PersonId,
FirstDate = MIN([date]) OVER (PARTITION BY personId ORDER BY [date]),
NextDate = LAG([date],1,[date]) OVER (PARTITION BY personId ORDER BY [date]),
[date],
grouper =
DATEDIFF(DAY, MIN([date]) OVER (PARTITION BY personId ORDER BY [date]), [date]) / 365
FROM @tbl_events
),
Prep AS
(
SELECT
PersonId,
firstDate = IIF(grouper = 0, FirstDate, IIF(FirstDate = NextDate, [date],NextDate))
FROM groupings
)
SELECT
PersonId,
FirstDate,
[Sequence] = ROW_NUMBER() OVER (PARTITION BY personId ORDER BY FirstDate),
[Events] = COUNT(*)
FROM prep
GROUP BY personId, FirstDate;
Результаты
PersonId FirstDate Sequence Events
----------- ---------- -------------------- -----------
1 2015-03-30 1 3
2 2016-07-18 1 3
3 2014-10-01 1 1
3 2016-11-28 2 3
4 2017-04-13 1 2
Первое замечание за все годыесть 365 дней, тем не менее, я использую 365 для эмуляции вашей логики Excel;это необходимо обновить, чтобы учесть високосные годы.Далее, как ваша формула Excel - это будет правильно только при наличии двух последовательностей;это не сработает, если, скажем, у personId будет дата 1 января 2015 года, затем 10 января 2016 года, а затем 1 февраля 2017 года. Дайте нам знать, нужна ли нам логика для учета вышеупомянутых сценариев.
Наконец, это решение используетLAG, для которой требуется SQL Server 2012+, если вы работаете с более ранней версией SQL, запрос должен быть соответствующим образом обновлен.