Frage

I have data that looks like the following:

B_Pt_No | MRN  | B_Adm_Date | B_Dsch_Date | B_Days_Stay | B_Days_To_Readmit     
123     | 1234 | 4/3/2013   | 4/10/2013   | 7           | 30    
123     | 1234 | 4/3/2013   | 4/10/2013   | 7           | 30
125     | 1229 | 4/9/2013   | 4/22/2013   | 13          | 23    

I get the data using the following query:

-- VARIABLE INITIALIZATION AND DECLARATION
DECLARE @SD AS DATE;
DECLARE @ED AS DATE;
SET @SD = '2011-01-01';
SET @ED = '2013-12-31';

-- COLUMN SELECTION
SELECT DISTINCT B_Pt_No AS [READMIT ENCOUNTER]
, B_Med_Rec_No AS [MRN]
, B_Adm_Src_Desc AS [READMIT SOURCE]
, CAST(B_Adm_Date AS DATE) AS [READMIT DATE]
, CAST(B_Dsch_Date AS DATE) AS [READMIT DISC DATE]
, DATEPART(MONTH, B_Dsch_Date) AS [READMIT MONTH]
, DATEPART(YEAR, B_Dsch_Date) AS [READMIT YEAR]
, B_Days_Stay AS [LOS]
, MAX(B_Days_To_Readmit) OVER (PARTITION BY B_PT_NO) AS [INTERIM] <-- trouble
, CASE 
    WHEN B_Pyr1_Co_Plan_Cd = '*' 
    THEN 'SELF PAY' 
    ELSE B_Pyr1_Co_Plan_Cd 
    END AS [READMIT INSURANCE]
, B_Mdc_Name AS [READMIT MDC]
, B_Drg_No AS [READMIT DRG]
, B_Clasf_Desc AS [READMIT DX CLASF]
, B_Readm_Adm_Dr_Name AS [READMIT ADMITTING DR]
, B_Readm_Atn_Dr_Name AS [READMIT ATTENDING DR]
, B_Hosp_Svc AS [READMIT HOSP SVC]

-- DB USED
FROM smsdss.c_readmissions_v

-- FILTER(S) USED
/*
THE FIRST FILTER IS STATING THAT WE ONLY WANT MRN'S THAT HAVE HAD A 
DRG FROM A CERTAIN GROUP.
*/
WHERE B_Med_Rec_No IN (
    SELECT DISTINCT MED_REC_NO

    FROM smsdss.BMH_PLM_PtAcct_V

    WHERE Plm_Pt_Acct_Type = 'I'
    AND PtNo_Num < '20000000'
    AND Dsch_Date BETWEEN @SD AND @ED
    AND drg_no IN (        -- DRG'S OF INTEREST
        '190','191','192'  -- COPD
        ,'291','292','293' -- CHF
        ,'193','194','195' -- PN
    )
)
AND B_Dsch_Date BETWEEN @SD AND @ED
AND B_Adm_Src_Desc != 'Scheduled Admission'
AND B_Pt_No < '20000000'

So far the query is working very well and there are only 2 duplicates like the one noted in the example data. I am using DISTINCT for the VISIT_ID and using MAX(B_DAYS_TO_READMIT) OVER (PARTITION BY B_PT_NO) to get the maximum days between visits. The problem I run into is when the INTERIM column has the same value in two rows. Is it possible to use some sort of combination of MAX() and ROW_NUMBER() in order to get just one of them?

Thank you,

War es hilfreich?

Lösung

;WITH cte AS 
(
  SELECT B_Pt_No AS [READMIT ENCOUNTER]
    , B_Med_Rec_No AS MRN
    , B_Adm_Src_Desc AS [READMIT SOURCE]
    , CAST(B_Adm_Date AS DATE) AS [READMIT DATE]
    , CAST(B_Dsch_Date AS DATE) AS [READMIT DISC DATE]
    , DATEPART(MONTH, B_Dsch_Date) AS [READMIT MONTH]
    , DATEPART(YEAR, B_Dsch_Date) AS [READMIT YEAR]
    , B_Days_Stay AS LOS
    , B_Days_To_Readmit AS INTERIM
    , CASE WHEN B_Pyr1_Co_Plan_Cd = '*' THEN 'SELF PAY' 
           ELSE B_Pyr1_Co_Plan_Cd END AS [READMIT INSURANCE]
    , B_Mdc_Name AS [READMIT MDC]
    , B_Drg_No AS [READMIT DRG]
    , B_Clasf_Desc AS [READMIT DX CLASF]
    , B_Readm_Adm_Dr_Name AS [READMIT ADMITTING DR]
    , B_Readm_Atn_Dr_Name AS [READMIT ATTENDING DR]
    , B_Hosp_Svc AS [READMIT HOSP SVC]
    , rn = ROW_NUMBER() OVER (PARTITION BY B_Pt_No ORDER BY B_Adm_Date DESC)
  FROM smsdss.c_readmissions_v AS r
  WHERE EXISTS 
  (
    SELECT 1 FROM smsdss.BMH_PLM_PtAcct_V
      WHERE Plm_Pt_Acct_Type = 'I'
      AND PtNo_Num < '20000000'
      AND Dsch_Date BETWEEN @SD AND @ED
      AND drg_no IN ('190','191','192'  -- COPD
          ,'291','292','293' -- CHF
          ,'193','194','195' -- PN
      ) AND MED_REC_NO = r.B_Med_Rec_No
  )
  AND B_Dsch_Date BETWEEN @SD AND @ED
  AND B_Adm_Src_Desc != 'Scheduled Admission'
  AND B_Pt_No < '20000000'
)
SELECT * FROM cte WHERE rn = 1;
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top