【发布时间】:2021-09-03 08:00:25
【问题描述】:
我有一个使用 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, 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)
GROUP BY Appointment_id
结果:
【问题讨论】:
-
您能否解释一下组件 id 3 如何同时与约会 id 1 和 3 相关联,如表 APPOINTMENT_COMPONENT 所示?约会 1 从 8:00 开始,在 9:30 结束……约会 2 从 9:00 开始,在 11:00 结束。也就是说,同一组件的两个约会同时(从 9:00 到 9:30)。
-
那是我的错!它们不能重叠。