попробуйте
CREATE TABLE PATIENTS
(
PATIENT_ID INT,
ENCOUNTER_DATE DATE
)
CREATE TABLE PATIENTS_TARGET
(
PATIENT_ID INT,
ENCOUNTER_DATE DATE
)
TRUNCATE TABLE PATIENTS;
INSERT INTO PATIENTS
SELECT 1 AS PATIENT_ID ,'2020-01-01' AS ENCOUNTER_DATE
UNION
SELECT 1 AS PATIENT_ID ,'2020-01-17' AS ENCOUNTER_DATE
UNION
SELECT 1 AS PATIENT_ID ,'2020-01-20' AS ENCOUNTER_DATE
UNION
SELECT 1 AS PATIENT_ID ,'2020-02-02' AS ENCOUNTER_DATE
UNION
SELECT 1 AS PATIENT_ID ,'2020-02-14' AS ENCOUNTER_DATE
UNION
SELECT 1 AS PATIENT_ID ,'2020-02-17' AS ENCOUNTER_DATE
UNION
SELECT 1 AS PATIENT_ID ,'2020-03-04' AS ENCOUNTER_DATE
UNION
SELECT 1 AS PATIENT_ID ,'2020-03-15' AS ENCOUNTER_DATE
UNION
SELECT 1 AS PATIENT_ID ,'2020-04-06' AS ENCOUNTER_DATE
UNION
SELECT 1 AS PATIENT_ID ,'2020-04-15' AS ENCOUNTER_DATE
UNION
SELECT 1 AS PATIENT_ID ,'2020-05-07' AS ENCOUNTER_DATE
UNION
SELECT 1 AS PATIENT_ID ,'2020-05-10' AS ENCOUNTER_DATE
UNION
SELECT 1 AS PATIENT_ID ,'2020-07-19' AS ENCOUNTER_DATE
UNION
SELECT 1 AS PATIENT_ID ,'2020-07-21' AS ENCOUNTER_DATE
UNION
SELECT 1 AS PATIENT_ID ,'2020-08-19' AS ENCOUNTER_DATE
UNION
SELECT 1 AS PATIENT_ID ,'2020-12-01' AS ENCOUNTER_DATE
--TRUNCATE TABLE PATIENTS_TARGET
--SELECT * FROM PATIENTS_TARGET
SELECT DISTINCT ENCOUNTER_DATE INTO #DATE FROM PATIENTS
ORDER BY ENCOUNTER_DATE
--SELECT * FROM #DATE
DECLARE @DATE_I DATE,@END_DATE DATE
SELECT @DATE_I=MIN(ENCOUNTER_DATE) FROM #DATE
SELECT @END_DATE=MAX(ENCOUNTER_DATE) FROM #DATE
WHILE @DATE_I<=@END_DATE
BEGIN
INSERT INTO PATIENTS_TARGET
SELECT PATIENT_ID
,ENCOUNTER_DATE
FROM
(SELECT
P.PATIENT_ID,
P.ENCOUNTER_DATE,
CASE WHEN T.PATIENT_ID IS NULL THEN 1
WHEN DATEDIFF(DAY,MAX(T.ENCOUNTER_DATE),P.ENCOUNTER_DATE)>=31 THEN 1
ELSE 0
END AS FLAG
FROM PATIENTS P
LEFT JOIN PATIENTS_TARGET T
ON P.PATIENT_ID=T.PATIENT_ID
WHERE P.ENCOUNTER_DATE=@DATE_I
GROUP BY P.PATIENT_ID,
P.ENCOUNTER_DATE,
T.PATIENT_ID
)AS A
WHERE FLAG=1
SET @DATE_I= DATEADD(DAY,1,@DATE_I)
END