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 つの薬の期間が 2 日以上重複していました。したがって、この例では、クエリが患者 1 の最初の 2 つのレコードを薬名の患者 ID と共に返すようにします。

誰かが助けてくれることを願っています。これはSQL Server 2008 R2 btwを使用しています。

4

3 に答える 3

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)
于 2013-05-28T18:49:05.303 に答える
0

できるはずのことは、drugName が異なり、2 番目のインスタンスの startDate または endDate が最初の startDate/endDate にまたがる、patientID および drugCategory フィールドで処方テーブルをそれ自体に結合することです。次に、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
于 2013-05-28T21:28:47.127 に答える
0

それらを別々の行にするか、1 つの行にするか。それらを別々の行にしたい場合は、これでうまくいくはずです。それ以外の場合は、結果をピボットできます。

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
            ;

H レコードと V レコードを結合します。もっと効率的な方法があると確信していますが、簡単には思いつきませんでした。(与えられた例では H だけが機能しますが、開始日が常に同じであるとは限らないより適切な例では、V 行も必要です。)

于 2013-05-28T16:47:56.933 に答える