sql - 计算多个日期范围内有多少个重叠日期
问题描述
我需要能够计算某人服用至少一种 A 类药物和一种 B 类药物的天数。
我遇到的最大问题之一是同一药物类别的处方可能相互重叠,当它们加入 B 类处方时,我最终会重复计算天数。
例如,在 21 年 1 月 1 日到 21 年 6 月 30 日之间,每个人服用 A 类和 B 类药物的总天数是多少
我以下面的假数据为例。
表格1
| ID | START | END | CLASS |
|:---- |:------| :-----| :-----|
|1234 |12-Feb-21 |19-Feb-21| A
|1234 |20-Feb-21 |22-Feb-21| A
|1243 |13-Mar-21 |23-Mar-21| A
|1234 |21-Apr-21 |1-May-21 |A
|1234 |20-Jun-21 |25-Jun-21 |A
|1234 |11-Jul-21 |16-Jul-21 |A
|4321 |25-Jan-21 |24-Feb-21 |A
|4321 |31-Jan-21 |2-Mar-21 |A
|4321 |28-Feb-21 |30-Mar-21 |A
|4321 |25-Mar-21 |24-Apr-21 |A
|4321 |25-Mar-21 |24-Apr-21 |A
|4321 |25-Apr-21 |25-May-21 |A
|4321 |29-Apr-21 |29-May-21 |A
|4321 |23-May-21 |22-Jun-21 |A
|4321 |26-May-21 |25-Jun-21 |A
|4321 |23-Jun-21 |23-Jul-21 |A
|4321 |23-Jun-21 |23-Jul-21 |A
表 2
| ID | START | END | CLASS |
|:---- |:------| :-----| :-----|
|1234 |18-Jan-21 |17-Feb-21 |B
|1234 |17-Mar-21 |16-Apr-21 |B
|1234 |14-Apr-21 |14-May-21 |B
|1234 |12-May-21 |11-Jun-21 |B
|1234 |9-Jun-21 |9-Jul-21 |B
|1234 |11-Jul-21 |10-Aug-21 |B
|4321 |25-Jan-21 |24-Feb-21 |B
|4321 |11-Feb-21 |13-Mar-21 |B
|4321 |7-Mar-21 |6-Apr-21 |B
|4321 |4-Apr-21 |4-May-21 |B
|4321 |30-Apr-21 |30-May-21 |B
|4321 |24-May-21 |23-Jun-21 |B
|4321 |20-Jun-21 |20-Jul-21 |B
PS - 我在 Oracle SQL Developer 工作
解决方案
一种相对简单的方法是蛮力方法。这将每个class
. 然后加入和聚合得到总数:
with cte1(id, d, endd, class) as (
select id, startd, endd, class
from table1
union all
select id, d + interval '1' day, endd, class
from cte1
where d < endd
),
cte2(id, d, endd, class) as (
select id, startd, endd, class
from table2
union all
select id, d + interval '1' day, endd, class
from cte2 -- edit here
where d < endd
)
select cte1.id, count(*)
from cte1 join
cte2
on cte1.id = cte2.id and cte1.d = cte2.d
group by cte1.id;
这是一个 db<>fiddle。
推荐阅读
- javascript - 无法使用 Selenium 和 java/javascript 在字段中输入数据
- nativescript - 如何在使用 nativescript-Angular 键入和更改 Android 设备的光标指针颜色时删除输入文本中的下划线
- oracle - 我想调用这个过程并传递在游标中获取的变量
- node.js - 复制“Concourse CI”节点调用/调试 process.stdin Net.socket
- c# - DbContext.AttachRange() 在这种情况下如何工作
- python - 通过 Anaconda 安装 libm.so.6
- javascript - 如何通过nodejs(通过heroku)下载文件并将它们存储到s3?
- android - 当我使用自定义 TextView 对齐文本时如何修复 Cutoff 大文本?
- python - 为什么我的 Google Maps API 请求的填充速度如此缓慢?
- javascript - 在一加 7 Pro [React-Native] 中截屏时,Android 应用程序崩溃