2013-06-18 3 views
1

Я задал информацию по этому запросу раньше, но вопрос, который я задаю сейчас, полностью отличается от ранее заданного вопроса. См. here для предыдущего вопроса, если хотите.Получение графика динамического диапазона дат

Этот код ниже, предполагается рассчитать количество для человека, оно должно использовать следующую информацию:

получает продолжительность пребывания и дает каждому диапазону баллов, < - это работает

Острота оценка, < - это работает

коморбидное Score, < - это работает

ER просмотров забить. < - это не работает

Я буду использовать себя в качестве примера:

сказать, что я пришел к Emergency Room июня 2013 года 18 и получить в больницу. После выписки у меня будет длительный срок пребывания, который оценивается по заявлению дела в @T1, там также рассчитывается острота.

Во втором запросе, я должен получить счет, сколько раз я пришел в отделение неотложной помощи в течение предыдущих 6 месяцев на основе 18 июня 2013 Дата. Это тот момент, который дает мне величайшее горе, и это тот момент, когда мой весь запрос ломается. Мне сложно понять, что каждый раз, когда приходит человек, они получают идентификатор посещения, но у человека есть только один MRN в качестве своего уникального идентификатора. Поэтому я должен посчитать, сколько раз кто-то приходил, за последние 180 дней в зависимости от даты разгрузки каждого визита. Например:

6-18-2013 MCP приходит к ER и получает признал

6-20-2013 MCP разряжается

Продолжительность пребывания = 2

Острота = 3

ER Посещения для MCP 6-18-2013 (не считайте это) 6-01-2013 (считайте это), 5-15-2013 (считайте это) 2-19-2013 (считайте это) 1-01- 2013 (не считайте это) ER Посещения = 3 не 5

Важно отметить, что посещение человека забито, а не лицо, это связано с ограничением диапазона дат на посещениях ER. Таким образом, я мог бы получить счет за свой 18 июня визит и иметь другой балл по 30 июля.

Я дал запрос в полном объеме до сих пор, так что моя логика от начала до конца может быть оценена. Я использую SQL Server 2008.

LOS и острый IP Scoring Запрос

-- VARIABLE DECLARATION AND INITIALIZATION 
SET ANSI_NULLS OFF 
GO 

DECLARE @SD DATETIME 
DECLARE @ED DATETIME 


-- QUERY ONE THAT GETS THE SCORING FOR THE LOS AND ACUITY --########--] 

-- THESE ARE PATIENT ADMIT DATES 
SET @SD = '2013-01-01' 
SET @ED = '2013-01-31' 

-- @T1 --------------------------------------------------------------] 
-- TABLE DECLARATION WHERE ALL RESULTS WILL GET DEPOSITED OF THE FIRST 
-- QUERY WILL GET DEPOSITED. THIS TABLE WILL GET USED IN CONJUNCTION 
-- WITH TWO OTHER TABLES IN ORDER TO COMPUTE THE FINAL 
DECLARE @T1 TABLE (
ENCOUNTER_ID VARCHAR(200) 
, MRN VARCHAR(200) 
, [PT AGE] VARCHAR(200) 
, [PT NAME] VARCHAR(500) 
, [DAYS STAY] VARCHAR(200) 
, [LACE DAYS SCORE] INT 
, [ACUTE ADMIT SCORE] VARCHAR(100) 
, ARRIVAL DATETIME 
) 
----------------------------------------------------------------------] 

-- @T1 RECORD INSERTIONS #############################################] 
INSERT INTO @T1 
SELECT 
A.PT_NO 
, A.MED_REC_NO 
, A.PT_AGE 
, A.PT_NAME 
, A.DAYS_STAY 
, A.LACE_DAYS_SCORE 
, A.ACUTE_ADMIT_LACE_SCORE 
, A.ADM_DATE 
--####################################################################] 

-- DAYS STAY, ACUTE ADMIT AND RELATED SCORING ------------------------- 
FROM 
    (SELECT PT_NO 
    , Med_Rec_No 
    , Pt_Age 
    , Pt_Name 
    , Days_Stay 
    , CASE 
     WHEN Days_Stay < 1 THEN 0 
     WHEN Days_Stay = 1 THEN 1 
     WHEN Days_Stay = 2 THEN 2 
     WHEN Days_Stay = 3 THEN 3 
     WHEN Days_Stay BETWEEN 4 AND 6 THEN 4 
     WHEN Days_Stay BETWEEN 7 AND 13 THEN 5 
     WHEN Days_Stay >= 14 THEN 6 
     END AS LACE_DAYS_SCORE 
    , CASE 
     WHEN PLM_PT_ACCT_TYPE = 'I' THEN 3 
     ELSE 0 
     END AS ACUTE_ADMIT_LACE_SCORE 
    , ADM_DATE 

    FROM SMSDSS.BMH_PLM_PTACCT_V 
    WHERE DSCH_DATE BETWEEN @SD AND @ED 
    AND Plm_Pt_Acct_Type = 'I' 
)A 

--SELECT * FROM @T1 

Результаты выше должен выглядеть следующим образом:

ENCOUNTER_ID| MRN | AGE | PT NAME | DAYS STAY | LACE DAYS STAY |ACUTE SCR | ARRIVAL 
123456789 | 123 | 65 | MCP  | 5  |  4   | 3  | 6/18/2013 

ЭР Количество запросов Как неподвижная by @JoaoLeal:

-- ER VISITS QUERY 
DECLARE @CNT TABLE (
MRN VARCHAR(100) 
, VISIT_ID VARCHAR(100) 
, VISIT_DATE DATETIME 
, VISIT_COUNT INT 
) 

INSERT INTO @CNT 
SELECT 
A.MRN 
, A.VISIT_ID 
, A.VISIT_DATE 
, COUNT(B.VISIT_ID) AS VISIT_COUNT 

FROM 
(SELECT MED_REC_NO AS MRN, VST_START_DTIME AS VISIT_DATE, PT_NO AS VISIT_ID 
FROM smsdss.BMH_PLM_PtAcct_V 
WHERE 
((
    PLM_PT_ACCT_TYPE = 'I' 
    AND ADM_SOURCE NOT IN 
     ('RA', 
     'RP' 
     ) 
    ) 
OR PT_TYPE = 'E') 
AND vst_start_dtime BETWEEN @SD AND @ED)A 

LEFT JOIN 
(SELECT MED_REC_NO AS MRN, VST_START_DTIME AS VISIT_DATE, PT_NO AS VISIT_ID 
FROM smsdss.BMH_PLM_PtAcct_V 
WHERE 
((
    PLM_PT_ACCT_TYPE = 'I' 
    AND ADM_SOURCE NOT IN 
     ('RA', 
     'RP' 
     ) 
    ) 
OR PT_TYPE = 'E') 
AND vst_start_dtime BETWEEN @SD AND @ED)B 
ON A.MRN = B.MRN 
AND A.VISIT_DATE > B.VISIT_DATE AND A.VISIT_DATE-180 <B.VISIT_DATE 

GROUP BY A.MRN, A.VISIT_ID, A.VISIT_DATE 
ORDER BY A.MRN 


--SELECT * FROM @CNT 

требуемый выход что-то вроде этого:

MRN | Visit_ID | Visit_Date | Visit_Count 
123 | 12345678 | 6/18/2013 |  1 

Со-болезненность Запрос

-- CO MORBIDITY QUERY 

DECLARE @CM TABLE (
ENCOUNTER_ID VARCHAR(200) 
, [MRN CM] VARCHAR(200) 
, NAME VARCHAR(500) 
, [CC GRP ONE SCORE] VARCHAR(20) 
, [CC GRP TWO SCORE] VARCHAR(20) 
, [CC GRP THREE SCORE] VARCHAR(20) 
, [CC GRP FOUR SCORE] VARCHAR(20) 
, [CC GRP FIVE SCORE] VARCHAR(20) 
, [CC LACE SCORE] INT 
) 
--##################################################################### 

INSERT INTO @CM 
SELECT 
C.PT_NO 
, C.MED_REC_NO 
, C.PT_NAME 
, C.PRIN_DX_CD_1 
, C.PRIN_DX_CD_2 
, C.PRIN_DX_CD_3 
, C.PRIN_DX_CD_4 
, C.PRIN_DX_CD_5 
, CASE 
    WHEN (C.PRIN_DX_CD_1+C.PRIN_DX_CD_2+C.PRIN_DX_CD_3+C.PRIN_DX_CD_4+C.PRIN_DX_CD_5) = 0 THEN 0 
    WHEN (C.PRIN_DX_CD_1+C.PRIN_DX_CD_2+C.PRIN_DX_CD_3+C.PRIN_DX_CD_4+C.PRIN_DX_CD_5) = 1 THEN 1 
    WHEN (C.PRIN_DX_CD_1+C.PRIN_DX_CD_2+C.PRIN_DX_CD_3+C.PRIN_DX_CD_4+C.PRIN_DX_CD_5) = 2 THEN 2 
    WHEN (C.PRIN_DX_CD_1+C.PRIN_DX_CD_2+C.PRIN_DX_CD_3+C.PRIN_DX_CD_4+C.PRIN_DX_CD_5) = 3 THEN 3 
    WHEN (C.PRIN_DX_CD_1+C.PRIN_DX_CD_2+C.PRIN_DX_CD_3+C.PRIN_DX_CD_4+C.PRIN_DX_CD_5) = 4 THEN 4 
    WHEN (C.PRIN_DX_CD_1+C.PRIN_DX_CD_2+C.PRIN_DX_CD_3+C.PRIN_DX_CD_4+C.PRIN_DX_CD_5) = 5 THEN 5 
    WHEN (C.PRIN_DX_CD_1+C.PRIN_DX_CD_2+C.PRIN_DX_CD_3+C.PRIN_DX_CD_4+C.PRIN_DX_CD_5) >= 6 THEN 6 
    END AS CC_LACE_SCORE 

FROM (
    SELECT distinct PT_NO 
    , MED_REC_NO 
    , PT_NAME 
    , CASE 
     WHEN PRIN_DX_CD IN (
     List of Codes 
     ) 
     THEN 1 
     ELSE 0 
     END AS PRIN_DX_CD_1 
    , CASE 
     WHEN PRIN_DX_CD IN (
     List of Codes 
     ) 
     THEN 2 
     ELSE 0 
    END AS PRIN_DX_CD_2 
    , CASE 
     WHEN PRIN_DX_CD IN (
     List of Codes 
     ) 
     THEN 3 
     ELSE 0 
     END AS PRIN_DX_CD_3 
    , CASE 
     WHEN PRIN_DX_CD IN (
     List of Codes 
     ) 
     THEN 4 
     ELSE 0 
     END AS PRIN_DX_CD_4 
    , CASE 
     WHEN PRIN_DX_CD IN (
     List of Codes 
     ) 
     THEN 6 
     ELSE 0 
     END AS PRIN_DX_CD_5 

     FROM smsdss.BMH_PLM_PtAcct_V 

     WHERE dsch_Date BETWEEN @SD AND @ED 


)C 
GROUP BY C.PT_NO 
, C.MED_REC_NO 
, C.PT_NAME 
, C.PRIN_DX_CD_1 
, C.PRIN_DX_CD_2 
, C.PRIN_DX_CD_3 
, C.PRIN_DX_CD_4 
, C.PRIN_DX_CD_5 
ORDER BY (C.PRIN_DX_CD_1+C.PRIN_DX_CD_2+C.PRIN_DX_CD_3+C.PRIN_DX_CD_4+C.PRIN_DX_CD_5) 
--SELECT * FROM @CM 

Желаемого выход так:

Visit_ID | MRN | Name | Grp 1 | Grp 2 | Grp 3 | Grp 4 | Grp 5 | Total 
1234567 | 123 | MCP | 0 | 2 | 3  | 4 | 0 | 6 

Положите его в целом:

DECLARE @LACE_MSTR TABLE (
MRN VARCHAR(200) 
,ENCOUNTER VARCHAR(200) 
, AGE VARCHAR(30) 
, NAME VARCHAR (500) 
, [LACE DAYS SCORE] INT 
, [LACE ACUTE IP SCORE] INT 
, [LACE ER SCORE] INT 
, [LACE COMORBID SCORE] INT 
) 

INSERT INTO @LACE_MSTR 
SELECT 
Q1.MRN 
, Q1.ENCOUNTER_ID 
, Q1.[PT AGE] 
, Q1.[PT NAME] 
, Q1.[LACE DAYS SCORE] 
, Q1.[ACUTE ADMIT SCORE] 
, CASE 
    WHEN Q1.[MRN COUNT] IS NULL THEN 0 
    WHEN Q1.[MRN COUNT] = 1 THEN 1 
    WHEN Q1.[MRN COUNT] = 2 THEN 2 
    WHEN Q1.[MRN COUNT] = 3 THEN 3 
    WHEN Q1.[MRN COUNT] >= 4 THEN 4 
    ELSE 0 
    END AS [LACE ER SCORE] 
, Q1.[CC LACE SCORE] 

FROM 
(
    SELECT 
    DISTINCT T1.ENCOUNTER_ID 
    , T1.MRN 
    , T1.[PT AGE] 
    , T1.[PT NAME] 
    , T1.[LACE DAYS SCORE] 
    , T1.[ACUTE ADMIT SCORE] 
    , CNT.[MRN COUNT] 
    , CM.[CC LACE SCORE] 

    FROM 
    @T1 T1 
    LEFT OUTER JOIN @CNT CNT 
    ON T1.MRN = CNT.MRN 
    JOIN @CM CM 
    ON CM.ENCOUNTER_ID = T1.ENCOUNTER_ID 
)Q1 

SELECT DISTINCT ENCOUNTER 
, MRN 
, AGE 
, NAME 
, [LACE DAYS SCORE] 
, [LACE ACUTE IP SCORE] 
, [LACE ER SCORE] 
, [LACE COMORBID SCORE] 
, [LACE DAYS SCORE]+[LACE ACUTE IP SCORE]+[LACE ER SCORE]+[LACE COMORBID SCORE] AS [TOTAL LACE] 

FROM @LACE_MSTR 

GROUP BY ENCOUNTER 
, MRN 
, AGE 
, NAME 
, [LACE DAYS SCORE] 
, [LACE ACUTE IP SCORE] 
, [LACE ER SCORE] 
, [LACE COMORBID SCORE] 

Этот запрос делает сшить с номером встречного для @CM ON @T1 таблиц и MRN на ER счетчик посещений и таблица T1. По какой-то очень странной причине, когда я делаю окончательный присоединиться как @CM on @T1 по MRN, я буду получать несколько записей для одного номера Encounter:

ENCOUNTER  |  MRN  |  CM SCORE 
12345   | 99999 |  9 
12345   | 99999 |  11 
+0

'Я должен подсчитать, сколько раз делаю некоторые один приходит, за последние 180 дней. Например: ER Посещения для MCP 6-18-2013 (не считайте это) 6-01-2013 (считайте это), 5-15-2013 (считайте это) 2-19-2013 (считайте это) 1-01 -2013 (не считайте это) ER Visits = 3 not 5' Вы понимаете, что 1/1/13 в течение 180 дней с 6/18/13, да? Ваш гигантский блок кода также является огромной болью для чтения. –

+0

Одна вещь, которую я замечаю, вы используете фильтры дат против DSCH_DATE в запросе @ t1, но vst_start_dtime и vst_end_dtime везде. Очевидно, что эти поля коррелированы, но уверены ли вы, что логика правильная? –

+0

@KyleHale Я снова рассмотрю логику, этот запрос - боль в моей стороне. Первоначально было три разных запроса, которые я хотел объединить воедино, и после большого количества fudging, безусловно, возможно, что я внес изменения, которых я не должен был иметь. –

ответ

1

ER Визиты для MRN

Пожалуйста, позвольте мне упростить запрос путем создания абстракции. В основном, для каждого MRN вы будете иметь возможность получить набор результатов с: MRN, Visit_ID, Visit_Date (я называю это <your sub query> ниже)

С этим списком вы можете запустить следующий запрос, чтобы получить число посещений:

SELECT 
    A.MRN, 
    A.VISIT_ID, 
    A.VISIT_DATE, 
    COUNT(B.VISIT_ID) AS VISIT_COUNT FROM (<your sub query>) A 
LEFT JOIN (<your sub query>) B ON 
    A.MRN = B.MRN AND 
    A.VISIT_DATE > B.VISIT_DATE AND A.VISIT_DATE - 180 < B.VISIT_DATE 
GROUP BY A.MRN, A.VISIT_ID, A.VISIT_DATE 

Надеется, что это помогает

Edit: <your sub query> должна быть что-то вроде этого:

SELECT MED_REC_NO AS MRN, VST_START_DTIME AS VISIT_DATE, PT_NO AS VISIT_ID 
FROM smsdss.BMH_PLM_PtAcct_V 
WHERE 
((
    PLM_PT_ACCT_TYPE = 'I' 
    AND ADM_SOURCE NOT IN 
     ('RA', 
     'RP' 
     ) 
    ) 
OR PT_TYPE = 'E') 
+0

Да, мой запрос немного беспорядок, я думаю, работа продолжается. Я приступлю к этому предложению, и если это сработает, то ваши очки. –

+0

Код работал отлично, теперь все проблемы решены с небольшим обслуживанием. Спасибо много. –

Смежные вопросы