2013-07-24 2 views
-1

나는 작업중인 쿼리가 있는데 사람 선택 순서에 대한 기준을 변경하려고합니다. 대신 사람이 주문한 의사 유형에 따라 선택되는 대신, 사람이 특정 유형의 의사가 수행 한 활동이있는 경우 결과가 표시되기를 원합니다.SQL Server 2008 R2를 표시하는 중복 레코드

경우에 따라 동일한 주문이 1000 회 이상 표시됩니다. , 전체 주문 번호가 동일 같이

ROW_NUM | VISIT ID | ORD DESC | ORD NUM | ORD STS | ORD DTIME 
1  | 123456 | INSERT F | 987654 | ACTIVE | 2013-01-01 10:01:00.000 
2  | 123456 | INSERT F | 987654 | ACTIVE | 2013-01-01 10:01:00.000 
3  | 123456 | INSERT F | 987654 | ACTIVE | 2013-01-01 10:01:00.000 
. 
. 
. 
568  | 123456 | INSERT F | 987654 | ACTIVE | 2013-01-01 10:01:00.000 

, 그래서 나는 단지 그것을 진행 중, 활성화 된 순서의 하나 개의 인스턴스가 필요합니다 여기

내 쿼리에서 일부 출력의 예입니다 이 쿼리는 다른 쿼리와 매우 유사합니다. 유일한 차이점은 질문에 대한 질문입니다. 나는이 새로운 버전이 더 효과적 일 때 더 정확할 것이라고 느낀다.
DECLARE @SD DATETIME 
DECLARE @ED DATETIME 
SET @SD = '2013-06-01'; 
SET @ED = '2013-06-30'; 

WITH [SX FLAG] AS (
    SELECT 
    PV.PtNo_Num AS [VISIT ID] 
    , PV.Med_Rec_No AS MRN 
    , PV.vst_start_dtime AS ADM 
    , PV.vst_end_dtime AS DISCH 
    , PV.Days_Stay AS LOS 
    , PV.pt_type AS [PT TYPE] 
    , PV.hosp_svc AS [HOSP SVC] 
    , SO.ord_no AS [ORD NUM] 
    , X.[ORD DESC] 
    , SO.pty_name AS [PARTY NAME] 
    , OSM.ord_sts AS [ORD STS] 
    , SOS.prcs_dtime AS [ORD STS TIME] 
    , DATEDIFF(DAY,PV.vst_start_dtime,SOS.prcs_dtime) AS [ADM TO ORD STS IN DAYS] 
    , MAX(CASE WHEN [ORD DESC] IN ('INSERT FOLEY', 'REMOVE FOLEY') THEN 1 ELSE 0 END) 
     OVER (PARTITION BY PV.PTNO_NUM) AS HasInsertRemoveFoley 
    , MAX(CASE WHEN ACDV.actv_group = 'OR' THEN 1 ELSE 0 END) 
     OVER (PARTITION BY PV.PTNO_NUM) AS HasORTime 

    FROM smsdss.BMH_PLM_PtAcct_V PV 
    JOIN smsmir.sr_ord SO 
    ON PV.PtNo_Num = SO.episode_no 
    JOIN smsmir.sr_ord_sts_hist SOS 
    ON SO.ord_no = SOS.ord_no 
    JOIN smsmir.ord_sts_modf_mstr OSM 
    ON SOS.hist_sts = OSM.ord_sts_modf_cd 
    JOIN smsdss.actv_fct_v AFV 
    ON PV.Pt_No = AFV.pt_id 
    JOIN smsdss.actv_cd_dim_v ACDV 
    ON AFV.actv_cd = ACDV.actv_cd 

    CROSS APPLY (
     SELECT 
      CASE 
       WHEN SO.svc_desc = 'INSERT FOLEY CATHETER' THEN 'INSERT FOLEY' 
       WHEN SO.svc_desc = 'INSERT INDWELLING URINARY CATHETER TO GRAVITY DRAINAGE' THEN 'INSERT FOLEY' 
       WHEN SO.svc_desc = 'REMOVE INDWELLING URINARY CATHETER' THEN 'REMOVE FOLEY' 
       ELSE SO.svc_desc 
      END AS [ORD DESC] 
      ) X 


    WHERE PV.Adm_Date BETWEEN @SD AND @ED 
    AND SO.svc_cd IN ('PCO_REMFOLEY' -- <-- The orders I am looking for 
     ,'PCO_INSRTFOLEY'  -- <-- for patients who have had a 
     ,'PCO_INSTFOLEY'  -- <-- surgical procedure 
     ,'PCO_URIMETER' 
     ) 
    -- I don't want patients who fall into these pt types 
    AND PV.hosp_svc NOT IN (
     'DIA' 
     ,'DMS' 
     ,'EME' 
     ) 
    -- This is supposed to kick out orders that were 'Discontinued' 
    -- or orders that were 'Canceled' 
    AND SO.ord_no NOT IN (
     SELECT SO.ord_no 

     FROM smsdss.BMH_PLM_PtAcct_V PV 
     JOIN smsmir.sr_ord SO 
     ON PV.PtNo_Num = SO.episode_no 
     JOIN smsmir.sr_ord_sts_hist SOS 
     ON SO.ord_no = SOS.ord_no 
     JOIN smsmir.ord_sts_modf_mstr OSM 
     ON SOS.hist_sts = OSM.ord_sts_modf_cd 
     JOIN smsdss.actv_fct_v AFV -- <-- gets pt activity 
     ON PV.Pt_No = AFV.pt_id 
     JOIN smsdss.actv_cd_dim_v ACDV -- <-- tells me if pt had OR Time 
     ON AFV.actv_cd = ACDV.actv_cd 

     WHERE OSM.ord_sts = 'DISCONTINUE' -- <-- don't want these orders 
     AND SO.svc_cd IN ('PCO_REMFOLEY' -- <-- to show if they were 
     ,'PCO_INSRTFOLEY'     -- <-- canned/discontinued 
     ,'PCO_INSTFOLEY' 
     ,'PCO_URIMETER' 
     ) 
    ) 
) 
SELECT * 
FROM [SX FLAG] 
WHERE HasInsertRemoveFoley = 1 
AND HasORTime = 1 

감사합니다, 당신의 쿼리가 올바른 또는 잘못된 결과를 생성 여부를 결정하기 위해 당신에게 달려 될 것

+0

Downvoter 왜 내가 향상시킬 수 있는지 말해 줄 수 있습니까? 아무런 설명도없이 하향 투표하면 아무도 좋은 결과를 얻지 못합니다. 즉, 나는 명확하지 않습니까? –

답변

0

: 여기에 위의 결과를 제공하는 쿼리입니다. 우리는 당신을 위해 그것을 할 수 없습니다.

유일한 결과는 동일한 행이 결과 테이블에서 여러 번 발생한다는 것을 확인하는 쉬운 방법이 있습니다. "SELECT"대신 "SELECT DISTINCT"를 사용하십시오. 이렇게하면 쿼리 속도가 느려질 수 있지만 디버깅에 도움이됩니다.

+0

나는 downvoted있어 당연하지, 누군가가 내 forhead에 실패합니다. 결과 세트가 맞는지는 알 수 있지만, DISTINCT를 사용하지 않는다면 나에게 -1이라고 분명히 알 수 있습니다. –