1

SQL Server 2008 R2 を使用しており、日付が重複しているかどうかを示すクエリを作成しようとしています。

誰かが特定の基準でカバーされている日数を計算しようとしています。これがテーブルの例です...

CREATE TABLE    mytable
(   

CARDNBR varchar(10) 
GPI char(14)    ,
GPI_DESCRIPTION_10  varchar(50) ,
RX_DATE datetime    ,
DAYS_SUPPLY int ,
END_DT  datetime    ,
METRIC_QUANTITY float   

)       
INSERT INTO mytable VALUES ('1234567890','27200040000315','Glyburide','01/30/2013','30','03/01/2013','60')      
INSERT INTO mytable VALUES ('1234567890','27200040000315','Glyburide','03/04/2013','30','04/03/2013','60')      
INSERT INTO mytable VALUES ('1234567890','27250050007520','Metformin','01/03/2013','30','02/02/2013','120')     
INSERT INTO mytable VALUES ('1234567890','27250050007520','Metformin','02/27/2013','30','03/29/2013','120') 

最初の RX_DATE から最後の END_DT までの人がカバーされた日数をカウントできるようにしたいと考えています。この例では 90 日 (4/3/13 - 1/3/13) です。

その部分は完了していますが、ここで問題が発生しています。

列 1 と列 2 の間に、薬を服用していない期間が 3 日間ありました。行 3 と 4 の間には 25 日間の期間がありました。ただし、その 25 日間で、行 1 がそのギャップをカバーしました。したがって、行 1 と行 2 の間のギャップを示す最後の数字は 3 です。

どんな助けでも大歓迎です。

ありがとう。

4

1 に答える 1

1

より良いアプローチがあるかもしれませんが、日のルックアップを作成し、それに結合して、結合する個別の日を選択することができます。これにより、すべての行の合計日数が得られます。

CREATE TABLE #lkp_Calendar (Dt DATE)
GO
SET NOCOUNT ON
DECLARE @intFlag INT
SET @intFlag = 1
WHILE (@intFlag <=500)
BEGIN
--Loop through this:
INSERT INTO #lkp_Calendar 
SELECT DATEADD(day,@intFlag,'20120101')
SET @intFlag = @intFlag + 1
END
GO

--対象日数

SELECT CARDNBR, COUNT(DISTINCT b.Dt)CT
FROM  #mytable a
JOIN #lkp_Calendar b
    ON b.Dt BETWEEN a.RX_DATE AND a.END_DT
GROUP BY CARDNBR

-- 総日数

SELECT CARDNBR, DATEDIFF(DAY,MIN(RX_DATE),MAX(END_DT))+1 'Total_Days'
        FROM #mytable
        GROUP BY CARDNBR

--組み合わせた

SELECT covered.CARDNBR, covered.CT 'Days Covered', total.Total_Days 'Total Days', total.Total_Days - covered.CT 'Days Gap'
FROM  (SELECT CARDNBR, COUNT(DISTINCT b.Dt)CT
        FROM  #mytable a
        JOIN #lkp_Calendar b
            ON b.Dt BETWEEN a.RX_DATE AND a.END_DT
        GROUP BY CARDNBR
      )covered
JOIN (SELECT CARDNBR, DATEDIFF(DAY,MIN(RX_DATE),MAX(END_DT))+1 'Total_Days'
        FROM #mytable
        GROUP BY CARDNBR
     )total
ON covered.CARDNBR = total.CARDNBR

あなたは 90 日とおっしゃいましたが、91 日とすべきだと思います。ただし、カバレッジが rx 日に開始されるか、翌日に開始されるかは、お客様が決めることができます。

于 2013-06-05T15:59:07.493 に答える