Я отвечу, чтобы начать диалог, над которым мы можем работать.
Проблема, с которой я столкнулся, заключается в разнице в днях для ID = 102 между последней записью и той, которую вы выбрали в качестве IPST, составляет 29 дней, но IPST, которую вы выбрали для 102, составляет 393 дня, это это правильно?
Вам не нужно зацикливаться, чтобы решить эту проблему. Если вы сравниваете все свои даты только с самыми последними, вы можете просто использовать MAX:
DECLARE @PatientRecords TABLE
(
ID INTEGER,
StartDate DATE,
Medicine VARCHAR(100)
)
INSERT INTO @PatientRecords VALUES
(101,'20181201','XYZ'),
(101,'20190115','XYZ'),
(101,'20190317','XYZ'),
(101,'20190401','XYZ'),
(101,'20190415','XYZ'),
(102,'20190401','XYZ'),
(102,'20190415','XYZ'),
(102,'20190315','XYZ'),
(102,'20180318','XYZ');
With maxCTE AS
(
SELECT *, DATEDIFF(DAY, StartDate, MAX(StartDate) OVER (PARTITION BY ID, MEDICINE ORDER BY StartDate ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING)) [IPSTDateDifference]
FROM @PatientRecords
)
SELECT m.ID, m.Medicine, MIN(m.StartDate) [IPST]
FROM maxCTE m
WHERE [IPSTDateDifference] < 60
GROUP BY m.ID, m.Medicine
ORDER BY 1,3;