SQL中的重叠日期

Posted

技术标签:

【中文标题】SQL中的重叠日期【英文标题】:Overlapping dates in SQL 【发布时间】:2016-04-13 12:16:35 【问题描述】:

我有一张表格,列出了患者接受任何类型药物的所有时间,如下所示:

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。有谁知道怎么做?

【问题讨论】:

需要重叠多少种药物?或者您只是在寻找一些人至少服用两种药物的时期? 至少有两种药物重叠的任何时期。 【参考方案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

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

问候

【讨论】:

感谢您的回答。您是说 a.OrderID b.OrderID 吗?这看起来可能是第二个订单可能以第一个订单结束的原因,尽管我对 a.End_Date 为何会使“第一个”重叠感到困惑。 感谢您的反馈,我的意思是加入订单 ID,并且我们将同一张表的两个副本连接在一起,这样可以确保订单 ID 和患者 ID 匹配以形成连接.我们正在检查 A 是否在 B 开始之前结束,如果没有并且 A 在 B 开始之后结束,则存在重叠。同样,如果 A 在 B 结束之前开始,那么也会有重叠。如果不让我知道,希望这是有道理的,我会更新我的答案。 这适用于两个日期,但应该切换 first_overlap 和 last_overlap 日期。多个日期不太合适(所以,如果有人有 3 个重叠的用药日期),但这段代码确实让我想到了正确的方向,所以谢谢。【参考方案2】:

试试这个:

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

【讨论】:

这看起来是个不错的解决方案,谢谢! a.order_id a.start_dt 吗?当“第二个”药物订单在第一个之前结束时怎么办?抱歉,如果这令人困惑。 这只是为了防止交叉连接加倍。如果你把它拿出来运行它你会看到原因。

以上是关于SQL中的重叠日期的主要内容,如果未能解决你的问题,请参考以下文章

岛屿和间隙的 SQL:岛屿可以重叠

SQL 重叠日期范围

SQL Server - 重叠数据的累积总和 - 获取总和达到给定值的日期

如何在 SQL 中选择重叠的日期范围

SQL Server 2014 合并重叠日期范围

Oracle SQL 选择具有开始和结束日期的行,如果某些重叠合并行