如何解决SQL H2 重叠日期间隔聚合
我有一个使用 H2 语法的 SQL 查询,它返回一个正在使用组件的约会列表。这不考虑使用相同 component_type_id 的重叠约会。
每个区块都是一个使用不同组件的约会。例子: 一共有x4个component_type_id = 33。
- 约会 1 是在 08:00 到 09:30 之间,使用 x3 component_type_id = 33。
- 约会 2 是在 09:00 到 11:00 之间,使用 x1 component_type_id = 33。 这意味着在 09:00 到 09:30 之间,所有 x4 资源都不可用。我想要那个时间范围。
component_type_id=33 的约会:
08:00 ----- <-|
08:30 | | | 9 total machines are taken during this timeframe
09:00 |x3 | ----- |
09:30 ----- | | ----- |
10:00 | | | | |
10:30 |x1 | |x0 | <-|
11:00 ----- | |
11:30 -----
应该返回:
08:00
08:30
09:00 -------------- <-| All x4 component_type_id=33 are taken
09:30 -------------- <-|
10:00
10:30
11:00
11:30
简化的表格:
任命:
| id | start_time | end_time |
| --- | ------------------- | ------------------- |
| 1 | 2021-05-21 8:00:00 | 2021-05-21 09:30:00 |
| 2 | 2021-05-21 09:00:00 | 2021-05-21 11:00:00 |
| 3 | 2021-05-21 09:30:00 | 2021-05-21 11:30:00 |
组件:
| id | component_type_id | name |
| --- | ----------------| ---- |
| 1 | 4 | pc12 |
| 2 | 4 | pc13 |
| 3 | 4 | pc14 |
| 4 | 3 | vm45 |
| 5 | 3 | vm46 |
| 6 | 3 | vm47 |
| 7 | 1 | gg67 |
| 8 | 1 | gg68 |
| 9 | 1 | gg69 |
| 10 | 1 | gg70 |
APPOINTMENT_COMPONENT:(交叉表)
| id | appointment_id| component_id|
| --- | --------------| ----------- |
| 1 | 1 | 3 |
| 2 | 1 | 4 |
| 3 | 1 | 5 |
| 4 | 2 | 1 |
| 5 | 2 | 2 |
| 6 | 2 | 3 |
| 7 | 2 | 7 |
| 8 | 3 | 4 |
| 9 | 3 | 5 |
非聚合查询(用于演示):
select a.appointment_id,c.component_id,ct.component_type_id,a.appointment_start_time,a.appointment_end_time,(select count(*) from component where component.component_id = c.component_id and component.component_type_id = 33) as total_used_component_type,(select count(*) from component where component.component_type_id = 33) as total_component_type from appointment a
left join appointment_component ac on a.appointment_id = ac.appointment_id
inner join component c on c.component_id = ac.component_id
inner join component_type ct on ct.component_type_id = c.component_type_id
and a.appointment_start_time >= '2021-05-21T08:00:00.000-05:00' and a.appointment_end_time <= '2021-05-21T16:00:00.000-05:00' and c.component_type_id=33
我稍后会TOTAL_COMPONENT_TYPE - TOTAL_USED_COMPONENT_TYPE来检查有多少组件可用。 我的目标是在两个日期之间找到不可用组件类型。
聚合查询:
select appointment_id,(TOTAL_COMPONENT_TYPE - SUM(TOTAL_USED_COMPONENT_TYPE)) AS TOTAL_AVAILABLE_COMPONENT_TYPE FROM (
select a.appointment_id,(select count(*) from component where component.component_type_id = 33) as total_component_type from appointment a
left join appointment_component ac on a.appointment_id = ac.appointment_id
inner join component c on c.component_id = ac.component_id
inner join component_type ct on ct.component_type_id = c.component_type_id
and a.appointment_start_time >= '2021-05-21T08:00:00.000-05:00' and a.appointment_end_time <= '2021-05-21T16:00:00.000-05:00' and c.component_type_id=33)
GROUP BY Appointment_id
结果:
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。