2

我有一个结构表

(处方)

clmID         int
patid         int
drugclass     char(3)
drugName      char(25)
fillDate      date
scriptEndDate date
strength      int

和一个查询

;with PatientDrugList(patid, filldate,scriptEndDate,drugClass,strength)      
as      
(      
select rx.patid,rx.fillDate,rx.scriptEndDate,rx.drugClass,rx.strength      
 from rx      
)      
,      
DrugList(drugName)      
as      
(      
select x.drugClass      
from (values('h3a'),('h6h'))      
as x(drugClass)      
where x.drugClass is not null      
)      
SELECT PD.patid, C.calendarDate AS overlap_date      
 FROM PatientDrugList AS PD, Calendar AS C      
 WHERE drugClass IN ('h3a','h6h')      
  AND calendardate BETWEEN filldate AND scriptenddate      
 GROUP BY PD.patid, C.CalendarDate      
HAVING COUNT(DISTINCT drugClass) = 2     
order by pd.patid,c.calendarDate  

Calendar是一个简单的日历表,其中包含整个研究期间所有可能的日期,没有其他列。

我的查询返回的数据看起来像

在此处输入图像描述

重叠日期表示每天在 PatientDrugList CTE 之后列出的两个类别中为一个人开具药物。

我想知道每个人连续服用两种药物的天数。我不能使用简单maxmin汇总,因为这不会告诉我是否有人停止了这个方案然后重新开始。什么是找出这一点的有效方法?

编辑:DrugList CTE 中的行构造函数应该是存储过程的参数,并且为了本示例的目的进行了修改。

4

2 回答 2

1

您正在寻找连续的日期序列。关键的观察是,如果你从日期中减去一个序列,你会得到一个恒定的日期。这定义了一组按顺序排列的日期,然后可以对其进行分组。

select patid
  ,MIN(overlap_date) as start_overlap
  ,MAX(overlap_date) as end_overlap
  from(select cte.*,(dateadd(day,row_number() over(partition by patid order by overlap_Date),overlap_date)) as groupDate
        from cte
      )t
  group by patid, groupDate

此代码未经测试,因此可能有一些拼写错误。

于 2013-01-03T20:25:09.067 回答
-2

您需要以某件事为中心,并以最大和最小的方式解决该问题。你能说明是否有人在日期枢纽上同时服用两种药物吗?如果我正确理解您的问题,那么您将受到日期限制。

EG 示例 SQL:

  declare @Temp table ( person varchar(8), dt date, drug varchar(8));

insert into @Temp values ('Brett','1-1-2013', 'h3a'),('Brett', '1-1-2013', 'h6h'),('Brett','1-2-2013', 'h3a'),('Brett', '1-2-2013', 'h6h'),('Joe', '1-1-2013', 'H3a'),('Joe', '1-2-2013', 'h6h');

with a as 
    (
    select
        person
    ,   dt
    ,   max(case when drug = 'h3a' then 1 else 0 end) as h3a
    ,   max(case when drug = 'h6h' then 1 else 0 end) as h6h
    from @Temp
    group by person, dt
    )
, b as 
    (
    select *, case when h3a = 1 and h6h = 1 then 1 end as Logic
    from a
    )
select person, count(Logic) as DaysOnBothPresriptions
from b
group by person
于 2013-01-03T20:28:18.060 回答