2013-06-18 155 views
1

以前我詢問過有關此查詢的信息,但現在問的問題與以前的問題完全不同。如果需要,請參閱here以解決上一個問題。計算動態日期範圍

下面這段代碼,應該計算數量的人,就應該使用以下信息:

獲取一個長住,並給每個範圍內的得分,< - 這個工程

易損度評分,< - 這個工程

共患得分,< - 這個工程

ER訪問得分。 < - 這不起作用

我會用我自己爲例:

說我來到急診室2013年6月18日並獲得住進了醫院。出院後我將有一段時間的住院時間,根據@T1的病例報告得分,敏銳度也計算在那裏。

在第二個查詢,我應該得到的我在過去6個月多少次來到急診室基礎上,2013年6月18日日計數。這是給我最大悲痛的一點,也是我整個查詢失敗的地步。對我來說很棘手的是,每次有人進來時,他們都會得到一個訪問ID,但是這個人只有一個MRN作爲他們的唯一標識符。所以我必須根據每次訪問的日期來計算在過去180天內有人進來的次數。例如:

2013年6月18日MCP涉及到ER和被承認

2013年6月20日MCP會放電

停留

長度= 2

視力= 3

ER訪問MCP 6-18-2013(不計算此項)6-01-2013(算了),5-15-2013(算了)2-19-2013(算了)1-01- 2013(不算這個)ER訪問量= 3而不是5

重要的是要指出,一個人的訪問得分,而不是人本身,這是由於ER訪問的日期範圍限制。因此,我可以在6月18日的訪問中獲得一個分數,並在7月30日的訪問中獲得不同的分數。

到目前爲止,我已經給出了完整的查詢,以便我可以評估從開始到結束的邏輯。我正在使用SQL Server 2008。

LOS和急性IP記分查詢

-- 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 

的ER數查詢作爲固定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  |  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訪問量= 3而不是5'你意識到2013年1月1日是在6/18/13的180天內,是嗎?你的巨大代碼塊也是一個巨大的痛苦閱讀。 –

+0

我注意到的一件事是您在@ t1查詢中針對DSCH_DATE使用日期過濾器,而在其他地方使用vst_start_dtime和vst_end_dtime。顯然這些領域是相關的,但你確定這個邏輯是正確的嗎? –

+0

@KyleHale我會再次通過邏輯,這個查詢是在我身邊的痛苦。這原本是三個不同的查詢,我想加入所有的一起,經過大量的欺騙之後,我做了一些我不應該做的改變。 –

回答

1

爲MRN

ER訪問

請允許我以簡化查詢通過創建一個抽象。基本上每個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 

希望這有助於

編輯:<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

代碼工作得很好,現在所有的問題都可以通過一些家務解決。非常感謝。 –