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
尽管语法可能略有不同,但希望该过程能帮助您找到正确的答案。
此致
我有一个 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
尽管语法可能略有不同,但希望该过程能帮助您找到正确的答案。
此致