Как реализовать циклы в SQL? - PullRequest
0 голосов
/ 04 мая 2019

Я пытаюсь рассчитать KPI для каждого пациента, KPI называется «Начальная дата начала назначения (IPST)».

Определение IPST - это наличие у пациента отрицательной истории использования этого конкретноголекарства в течение 60 дней до даты начала, дата начала которой является IPST.

Например, см. снимок экрана ниже, для пациента с ID = 101, я начну с IPST как 15.04.2009, разницав днях между 15.04.2009 и 01.04.2009 - 14 <60, поэтому я изменю свой IPST на 4/1/2019. </p>

Продолжая эту итерацию, IPST для 101 - 17.03.2009и 102 - это 3/18/2018, как показано в таблице справа.

Check example calculation here

Я попытался построить UDF, как показано ниже, где я нахожусьпередача идентификатора пациента и UDF возвращает IPST.

CREATE FUNCTION [Initial_Prescription_Date] (@id Uniqueidentifier

) ВОЗВРАЩАЕТСЯ дата КАК НАЧИНАЕТСЯ {я не могу реализовать этот код здесь
}


Я могу получить список Start_dates для пациентаt из таблицы лекарств, подобной этой:

Выберите id, start_date from Patient_medication

Мне придется пройти по этому списку, чтобы добраться до IPST для пациента.

1 Ответ

0 голосов
/ 04 мая 2019

Я отвечу, чтобы начать диалог, над которым мы можем работать.

Проблема, с которой я столкнулся, заключается в разнице в днях для 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...