Выбор данных с разницей в 31 день или более между каждой строкой для одного и того же значения столбца первичного ключа? - PullRequest
0 голосов
/ 17 апреля 2020

Пример: набор данных:

id             Encounter_date                
1              01-01-2020          
1              17-01-2020 
1              20-01-2020        
1              02-02-2020        
1              14-02-2020 
1              17-02-2020      
1              04-03-2020 
1              15-03-2020       
1              06-04-2020        
1              15-04-2020        
1              07-05-2020 
1              10-05-2020         
1              19-07-2020
1              21-07-2020        
1              19-08-2020        
1              01-12-2020 

Предположение: без дублирования с одинаковой датой встречи и идентификатором

Для идентификатора 1. Я должен выбрать наименьшую дату встречи_даты в качестве первой встречи

2-е столкновение должно быть> = 31 дней после первого столкновения

3-е столкновение должно быть> = 31 дня второго столкновения

4-я встреча должна состоять из> = 31 дня 3-й встречи

и так далее ...

Любые идеи для достижения этой цели в SQL который должен писать против базы данных красного смещения!

Ожидаемый результат:

 id     Encounter_date              difference in days
 1      01-01-2020                  0           
 1      02-02-2020                  32
 1      04-03-2020                  31
 1      06-04-2020                  33
 1      07-05-2020                  31
 1      19-07-2020                  73
 1      19-08-2020                  31
 1      01-12-2020                  104

Ответы [ 2 ]

1 голос
/ 18 апреля 2020

попробуйте

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
0 голосов
/ 17 апреля 2020

зная, существуют ли реально записи каждые 31 день, это трудная задача,

см .: dbfille

output:

patient_id  Encounter_date  previousDate    NrDays  code
1   2020-01-01          XXX
1   2020-01-17  2020-01-01  -16 YYY
1   2020-02-02  2020-01-17  -16 MM
1   2020-02-14  2020-02-02  -12 cc
1   2020-03-04  2020-02-14  -19 nn
2   2020-01-10  2020-03-04  54  XXX
2   2020-02-03  2020-01-10  -24 YYY
2   2020-02-14  2020-02-03  -11 MM
2   2020-02-16  2020-02-14  -2  cc
2   2020-03-24  2020-02-16  -37 nn
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...