在SQL中重叠日期

时间:2016-04-13 12:16:36

标签: sql netezza

我有一张表格列出了患者接受任何类似药物的所有时间:

Pat ID  Type of Admin    Order ID     Start Date          End Date
1       Medication       1            01/01/2016 04:20    01/04/2016 05:30
1       Medication       2            01/03/2016 18:30    01/07/2016 10:15

我想知道确切的重叠日期范围。所以结果表看起来像这样:

Pat ID      First_Overlap      Last_Overlap
1           01/03/2016 18:30   01/04/2016 05:30

我正在使用Netezza。有谁知道怎么做?

2 个答案:

答案 0 :(得分:1)

试试这个:

create temp table overlapTemp (
pat_id Int,
type_of_admin varchar(100),
order_id int,
start_dt timestamp,
end_dt timestamp
)
distribute on random;

insert into overlapTemp values(1,'Medication',1,'01/01/2016 04:20','01/04/2016 05:30');
insert into overlapTemp values(1,'Medication',2,'01/03/2016 18:30','01/07/2016 10:15');



select a.pat_id
,case when (b.start_dt,b.end_dt) overlaps (a.start_dt,a.end_dt) then b.start_dt end as overlap_start
,case when (b.start_dt,b.end_dt) overlaps (a.start_dt,a.end_dt) then a.end_dt end as overlap_end
from overlapTemp a inner join
overlapTemp b
on a.pat_id = b.pat_id
and a.order_id<b.order_id

答案 1 :(得分:1)

我不熟悉Netezza但是如果我要在MySQL或其他SQL变体中这样做,我会做这样的事情:

SELECT C.PatID AS PatID, MAX(C.FirstOverlap) AS FirstOverlap, MIN(C.LastOverlap) As LastOverlap
FROM (
  SELECT A.PatID AS PatID, CASE WHEN B.StartDate <= A.EndDate THEN B.StartDate ELSE A.EndDate END AS FirstOverlap,
  CASE WHEN B.EndDate >= A.StartDate THEN B.EndDate ELSE A.StartDate END AS LastOverlap
  FROM careAdmin AS A LEFT JOIN careAdmin AS B ON A.PatID = B.PatID AND A.OrderID = B.OrderID
  WHERE NOT B.EndDate <= A.StartDate OR B.StartDate >= A.EndDate
  ) C
GROUP BY C.PatID

即使语法略有不同,希望这个过程可以帮助您找到正确的答案。

问候