;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;
Use of MAX() and ROW_NUMBER() to get rid of duplicate data in SQL Server 2008 R2
-
25-09-2022 - |
سؤال
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,
المحلول
لا تنتمي إلى StackOverflow