1

以前にこのクエリに関する情報を尋ねたことがありますが、今尋ねている質問は以前の質問とはまったく異なります。必要に応じて、以前の質問についてはこちらを参照してください。

以下のこのコードは、人の数を計算することになっているため、次の情報を使用する必要があります。

滞在期間を取得し、各範囲にスコアを付けます <-- これは機能します

視力スコア、<--これは機能します

併存スコア、<-- これは機能します

ER 訪問スコア。<-- これは機能しません

私は例として自分自身を使用します:

2013 年 6 月 18 日に緊急治療室に来て、入院したとします。退院すると、滞在期間が決まります。これは、のケースステートメントに基づいて採点され@T1ます。Acuity もそこで計算されます。

2 番目のクエリでは、 2013 年 6 月 18 日の日付に基づいて、過去 6 か月間に救急治療室に来た回数を取得する必要があります。これが私に最大の悲しみを与えているポイントであり、私のクエリ全体が崩壊するポイントです. 私にとって注意が必要なのは、人が来るたびに訪問 ID を取得しますが、その人は一意の識別子として MRN を 1 つしか持っていないことです。ですから、各訪問の退院日に基づいて、過去 180 日間に誰かが何回来院したかを数えなければなりません。例えば:

2013 年 6 月 18 日MCP、ER に来て入院

2013/06/20MCP退院

滞在期間 = 2

視力 = 3

2013 年 6 月 18 日の ER 訪問MCP(これを数えないでください) 2013 年 6 月 1 日 (これを数えます)、2013 年 5 月 15 日 (これを数えます) 2013 年 2 月 19 日 (これを数えます) 2013 年 1 月 1 日 (数えます)これはカウントしないでください) ER 訪問 = 5 ではなく 3

記録されるのは個人ではなく、個人の訪問であることに注意することが重要です。これは、ER 訪問の日付範囲の制限によるものです。したがって、6 月 18 日の訪問のスコアと、7 月 30 日の訪問のスコアが異なる可能性があります。

最初から最後までロジックを評価できるように、これまでのところクエリ全体を提供しました。SQL Server 2008 を使用しています。

LOS および Acute 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

@JoaoLeal によって修正された ER カウント クエリ:

-- 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、ER 訪問回数と T1 テーブルを MRN で結合します。非常に奇妙な理由で、@CM on @T1MRN のように最終的な結合を行うと、1 つの遭遇番号に対して複数のレコードが取得されます。

ENCOUNTER     |     MRN     |     CM SCORE
12345         |    99999    |        9
12345         |    99999    |       11
4

1 に答える 1

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')
于 2013-06-27T14:59:11.503 に答える