Я задал информацию по этому запросу раньше, но вопрос, который я задаю сейчас, полностью отличается от ранее заданного вопроса. См. 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
'Я должен подсчитать, сколько раз делаю некоторые один приходит, за последние 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, да? Ваш гигантский блок кода также является огромной болью для чтения. –
Одна вещь, которую я замечаю, вы используете фильтры дат против DSCH_DATE в запросе @ t1, но vst_start_dtime и vst_end_dtime везде. Очевидно, что эти поля коррелированы, но уверены ли вы, что логика правильная? –
@KyleHale Я снова рассмотрю логику, этот запрос - боль в моей стороне. Первоначально было три разных запроса, которые я хотел объединить воедино, и после большого количества fudging, безусловно, возможно, что я внес изменения, которых я не должен был иметь. –