Похоже, что два упомянутых вами случая фактически совпадают.Вы хотите знать, прошло ли 84 дня когда-либо для каждого идентификатора.Вы можете сделать это с помощью следующего:
CREATE TABLE dbo.Onboarded
(
id VARCHAR(10),
rank INTEGER,
onboarded_at DATE,
applied_at DATE
);
INSERT INTO dbo.Onboarded VALUES
('A',1,'20180101','20180102'),
('A',2,'20180101','20180203'),
('A',3,'20180101','20180304'),
('B',1,'20180201',NULL),
('B',2,'20180201','20180801'),
('C',1,'20180301','20180401'),
('C',2,'20180301','20180801'),
('C',3,'20180301','20180901');
SELECT onb.[id],
onb.[rank],
onb.[onboarded_at],
onb.[applied_at],
onb.[lapsed_now],
CASE WHEN [lapsed_now] = 1 OR [lapsed_previous] = 1
THEN 1
ELSE 0
END [lapsed_ever],
CASE WHEN lapsed_now = 1
THEN DATEADD(DAY, 84, [lapsed_now_date])
ELSE [min_applied_at_add_84]
END [lapsed_date]
FROM
(SELECT *,
CASE
WHEN DATEDIFF(DAY, onboarded_at, MIN(ISNULL(applied_at, onboarded_at)) over (PARTITION BY id ORDER BY rank ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING)) >= 84
THEN 1
WHEN DATEDIFF(DAY, MAX(applied_at) OVER (PARTITION BY id ORDER BY rank ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING), GETDATE()) >= 84
THEN 1
ELSE 0
END [lapsed_now],
CASE
WHEN MAX(DATEDIFF(DAY, onboarded_at, ISNULL(applied_at, GETDATE()))) OVER (PARTITION BY id ORDER BY rank ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) >= 84
THEN 1
ELSE 0
END [lapsed_previous],
MAX(applied_at) OVER (PARTITION BY id ORDER BY rank ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) [lapsed_now_date],
DATEADD(DAY, 84, MIN(CASE WHEN applied_at IS NULL THEN onboarded_at ELSE applied_at END) OVER (PARTITION BY id ORDER BY rank ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING)) [min_applied_at_add_84]
FROM dbo.Onboarded
) onb
Результаты:
id rank onboarded_at applied_at lapsed_now lapsed_ever lapsed_date
A 1 2018-01-01 2018-01-02 1 1 2018-05-27
A 2 2018-01-01 2018-02-03 1 1 2018-05-27
A 3 2018-01-01 2018-03-04 1 1 2018-05-27
B 1 2018-02-01 (null) 0 1 2018-04-26
B 2 2018-02-01 2018-08-01 0 1 2018-04-26
C 1 2018-03-01 2018-04-01 0 1 2018-06-24
C 2 2018-03-01 2018-08-01 0 1 2018-06-24
C 3 2018-03-01 2018-09-01 0 1 2018-06-24
Ключ гарантирует, что ваша оконная функция обращает внимание на все строки в каждом окне, где находятся строкиВХОДИТ НЕОГРАНИЧЕННОЕ ПРЕЦЕДИРОВАНИЕ И НЕОГРАНИЧЕННОЕ СЛЕДУЮЩЕЕ.
Подробнее об их использовании вы можете прочитать здесь .