SQL 中的重叠日期

Overlapping dates in SQL

我有一个 table 列出了患者接受任何类型药物的所有时间,看起来像这样:

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

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

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

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

试试这个:

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

我不熟悉 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

尽管语法可能略有不同,但希望该过程能帮助您找到正确的答案。

此致