나는 작업중인 쿼리가 있는데 사람 선택 순서에 대한 기준을 변경하려고합니다. 대신 사람이 주문한 의사 유형에 따라 선택되는 대신, 사람이 특정 유형의 의사가 수행 한 활동이있는 경우 결과가 표시되기를 원합니다.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
감사합니다, 당신의 쿼리가 올바른 또는 잘못된 결과를 생성 여부를 결정하기 위해 당신에게 달려 될 것
Downvoter 왜 내가 향상시킬 수 있는지 말해 줄 수 있습니까? 아무런 설명도없이 하향 투표하면 아무도 좋은 결과를 얻지 못합니다. 즉, 나는 명확하지 않습니까? –