2013-05-28 3 views
0

나는 환자 처방집을 가지고 있는데, 각각 시작 날짜와 종료 날짜가 있습니다. 나는 환자가 2 일 이상 동일한 약물 카테고리에서 하나 이상의 약물을 복용하고있는 경우를 찾고 싶다. 기간이 중복되어야합니다.겹쳐지는 처방 찾기

테이블 구조는 다음과 같다 : 상술 한 바와 같이

PatientID StartDate EndDate Drug  DrugCategory 
1   1/1/2013 1/5/2013 A   Cat1 
1   1/1/2013 1/4/2013 B   Cat1 
1   1/10/2013 1/12/2013 C   Cat1 
2  ....... ........ ............. ......... 

은 환자 1은 동일한 카테고리 3 개 약 2 일 이상 지속 기간에서 오버랩 처음 두 약물을 처방 하였다. 따라서이 예에서는 환자 이름 1 인 patientid와 함께 Patient-1의 첫 번째 두 레코드를 쿼리에서 반환하겠습니다.

누군가가 도움을 줄 수 있기를 바랍니다. 이것은 SQL Server 2008 R2 btw를 사용하고 있습니다.

답변

0

개별 행이나 하나의 행으로 사용 하시겠습니까? 별도의 행으로 사용하려면이 방법이 유용합니다. 그렇지 않으면 결과를 피벗 할 수 있습니다.

create table want as 
    select H.* from have H, have V 
     where H.drug ne V.drug 
      and H.PatientID=V.PatientID 
      and H.startDate <= V.startDate 
      and V.startDate <= H.endDate-2 
    union select V.* from have H, have V 
     where H.drug ne V.drug 
      and H.PatientID=V.PatientID 
      and H.startDate <= V.startDate 
      and V.startDate <= H.endDate-2 
      ; 

I의 노조 H와 V 기록, 나는 그것을 할 수있는 더 효율적인 방법이있을거야하지만 쉽게 하나 가지고 올 수 없었다. (다만 H는 주어진 예제에서 작동하지만 시작 날짜가 항상 같지 않은 더 적절한 예제의 경우 V 행이 필요합니다.

0

사용하기 전에 철저히 테스트하십시오. 나는 그것을 시험해 보았지만 지금까지는 훌륭하게 보였으 나 철저한 시험은하지 않았다. 요구 사항에 더 충분히 테스트 할 수 있고 결과에 이상이있는 경우이를 가리킬 수 있거나 필요한 경우 앞으로 가져 와서 수정할 수 있다면 좋을 것입니다. 사용

--Test data: 
SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
SET ANSI_PADDING ON 
GO 
CREATE TABLE [dbo].[Prescriptions](
    [PatientID] [int] NULL, 
    [StartDate] [datetime] NULL, 
    [EndDate] [datetime] NULL, 
    [Drug] [varchar](50) NULL, 
    [DrugCategory] [varchar](50) NULL 
) ON [PRIMARY] 
GO 
SET ANSI_PADDING OFF 
GO 
INSERT [dbo].[Prescriptions] ([PatientID], [StartDate], [EndDate], [Drug], [DrugCategory]) VALUES (1, CAST(0x0000A13A00000000 AS DateTime), CAST(0x0000A13E00000000 AS DateTime), N'D', N'Cat1') 
INSERT [dbo].[Prescriptions] ([PatientID], [StartDate], [EndDate], [Drug], [DrugCategory]) VALUES (1, CAST(0x0000A13A00000000 AS DateTime), CAST(0x0000A13B00000000 AS DateTime), N'E', N'Cat1') 
INSERT [dbo].[Prescriptions] ([PatientID], [StartDate], [EndDate], [Drug], [DrugCategory]) VALUES (1, CAST(0x0000A13800000000 AS DateTime), CAST(0x0000A13B00000000 AS DateTime), N'F', N'Cat1') 
INSERT [dbo].[Prescriptions] ([PatientID], [StartDate], [EndDate], [Drug], [DrugCategory]) VALUES (1, CAST(0x0000A13800000000 AS DateTime), CAST(0x0000A13900000000 AS DateTime), N'G', N'Cat1') 
INSERT [dbo].[Prescriptions] ([PatientID], [StartDate], [EndDate], [Drug], [DrugCategory]) VALUES (1, CAST(0x0000A12300000000 AS DateTime), CAST(0x0000A13900000000 AS DateTime), N'Z', N'Cat1') 
INSERT [dbo].[Prescriptions] ([PatientID], [StartDate], [EndDate], [Drug], [DrugCategory]) VALUES (1, CAST(0x0000A12300000000 AS DateTime), CAST(0x0000A13A00000000 AS DateTime), N'Y', N'Cat1') 
INSERT [dbo].[Prescriptions] ([PatientID], [StartDate], [EndDate], [Drug], [DrugCategory]) VALUES (1, CAST(0x0000A13900000000 AS DateTime), CAST(0x0000A13D00000000 AS DateTime), N'A', N'Cat1') 
INSERT [dbo].[Prescriptions] ([PatientID], [StartDate], [EndDate], [Drug], [DrugCategory]) VALUES (1, CAST(0x0000A13900000000 AS DateTime), CAST(0x0000A13C00000000 AS DateTime), N'B', N'Cat1') 
INSERT [dbo].[Prescriptions] ([PatientID], [StartDate], [EndDate], [Drug], [DrugCategory]) VALUES (1, CAST(0x0000A14200000000 AS DateTime), CAST(0x0000A14400000000 AS DateTime), N'C', N'Cat1') 

검색어 :

SELECT DISTINCT PatientID,StartDate,EndDate,Drug,DrugCategory FROM (
SELECT 
    DATEDIFF(dd,a.startdate,b.startdate) c1 
    ,DATEDIFF(dd,a.enddate,b.enddate)c2 
    ,DATEDIFF(dd,a.startdate,b.enddate) c3 
    ,DATEDIFF(dd,a.enddate,b.startdate) c4 
    ,DATEDIFF(dd,a.startdate,b.enddate)+DATEDIFF(dd,a.enddate,b.startdate) c34 
    ,a.PatientID 
    ,a.StartDate 
    ,a.EndDate 
    ,a.Drug 
    ,a.DrugCategory 
    ,b.PatientID AS PatientID1 
    ,b.StartDate AS StartDate1 
    ,b.EndDate AS EndDate1 
    ,b.Drug AS Drug1 
    ,b.DrugCategory DrugCategory1 
FROM Prescriptions a 
,Prescriptions b 
WHERE a.patientid=b.patientid 
AND a.DrugCategory= b.DrugCategory 
and a.drug<>b.drug 
)a 
WHERE c1*c2*c3*c4 <0 
AND c3>2 
and c4<=-2 
ORDER BY 1,2,3,4 

결과 : 당신이 할 수있을 것입니다 무엇을

PatientID StartDate    EndDate     Drug            DrugCategory 
----------- ----------------------- ----------------------- -------------------------------------------------- -------------------------------------------------- 
1   2012-12-10 00:00:00.000 2013-01-02 00:00:00.000 Y             Cat1 
1   2012-12-31 00:00:00.000 2013-01-03 00:00:00.000 F             Cat1 
1   2013-01-01 00:00:00.000 2013-01-04 00:00:00.000 B             Cat1 
1   2013-01-01 00:00:00.000 2013-01-05 00:00:00.000 A             Cat1 
1   2013-01-02 00:00:00.000 2013-01-06 00:00:00.000 D             Cat1 

(5 row(s) affected) 
0

는 patientID 및 drugCategory 필드 drugName의 다릅니다 자체에 처방 테이블을 조인 두 번째 인스턴스의 startDate 또는 endDate는 첫 번째 인스턴스의 startDate/endDate에 걸쳐 있습니다. 그런 다음 max (startDates)와 min (endDates) 사이의 일 수를 뺀 오버랩 범위를 결정하십시오. 겹침이 2 일보다 길면 행을 반환하십시오.

select *, datediff(d, start_max, end_min) as overlap 
from (
    SELECT 
     P.PatientID, P.StartDate, P.EndDate, P.Drug, P.DrugCategory, 
     P1.StartDate AS p1_start, P1.EndDate AS p1_end, P1.Drug AS p1_drug, 
     CASE WHEN p.startdate >= P1.startdate THEN p.startdate ELSE P1.startdate END AS start_max, 
     CASE WHEN p.EndDate <= P1.EndDate THEN p.EndDate ELSE P1.EndDate END AS end_min 
    FROM 
     dbo.Prescriptions p INNER JOIN 
     dbo.Prescriptions AS P1 ON 
     P.PatientID = P1.PatientID AND 
     P.DrugCategory = P1.DrugCategory AND 
     P.Drug <> P1.Drug 
    WHERE 
     (P1.StartDate >= P.StartDate AND P1.StartDate <= P.EndDate) OR 
     (P1.EndDate >= P.StartDate AND P1.EndDate <= P.EndDate) 
) t 
where 
datediff(d, start_max, end_min) > 2 
관련 문제