我有一个包含多个时间窗口、可用性指标和优先级索引的数据集。
创建数据集:
CREATE TABLE TimeWindows(
TimeFrom DATETIME NOT NULL,
TimeTo DATETIME NOT NULL,
Priority INT NOT NULL,
Available BIT NOT NULL
);
INSERT INTO TimeWindows(TimeFrom, TimeTo, Priority, Available) VALUES
('2017-07-22 07:00:00', '2017-07-22 12:00:00', 1, 1),
('2017-07-22 13:00:00', '2017-07-22 17:00:00', 1, 1),
('2017-07-22 12:30:00', '2017-07-23 00:00:00', 3, 0),
('2017-07-23 07:00:00', '2017-07-23 12:00:00', 1, 1),
('2017-07-23 13:00:00', '2017-07-23 17:00:00', 1, 1),
('2017-07-23 00:00:00', '2017-07-24 00:00:00', 2, 0),
('2017-07-23 19:00:00', '2017-07-23 20:00:00', 4, 1),
('2017-07-24 07:00:00', '2017-07-24 12:00:00', 1, 1),
('2017-07-24 13:00:00', '2017-07-24 17:00:00', 1, 1),
('2017-07-24 15:00:00', '2017-07-24 16:00:00', 4, 0);
示例数据集:
| TimeFrom | TimeTo | Priority | Available |
|---------------------|---------------------|----------|-----------|
| 2017-07-22 07:00:00 | 2017-07-22 12:00:00 | 1 | 1 |
| 2017-07-22 13:00:00 | 2017-07-22 17:00:00 | 1 | 1 |
| 2017-07-22 12:30:00 | 2017-07-23 00:00:00 | 3 | 0 |
| 2017-07-23 07:00:00 | 2017-07-23 12:00:00 | 1 | 1 |
| 2017-07-23 13:00:00 | 2017-07-23 17:00:00 | 1 | 1 |
| 2017-07-23 00:00:00 | 2017-07-24 00:00:00 | 2 | 0 |
| 2017-07-23 19:00:00 | 2017-07-24 20:00:00 | 4 | 1 |
| 2017-07-24 07:00:00 | 2017-07-24 12:00:00 | 1 | 1 |
| 2017-07-24 13:00:00 | 2017-07-24 17:00:00 | 1 | 1 |
| 2017-07-24 15:00:00 | 2017-07-24 16:00:00 | 4 | 0 |
问题:
我想生成一组新的时间窗口,它只代表可用的时间段。
商业规则:
- 具有较高优先级的时间窗口将推翻具有较低优先级的冲突时间窗口
- 如果可用,可用性指示符设置为 1,如果不可用,则设置为 0
- 需要合并重叠的时间窗口
- 一个可用时间窗口被一段不可用时间“分割”,将被转换为两个单独的可用时间窗口
期望的结果:
| TimeFrom | TimeTo |
|---------------------|---------------------|
| 2017-07-22 07:00:00 | 2017-07-22 12:00:00 |
| 2017-07-23 19:00:00 | 2017-07-23 20:00:00 |
| 2017-07-24 07:00:00 | 2017-07-24 12:00:00 |
| 2017-07-24 13:00:00 | 2017-07-24 15:00:00 |
| 2017-07-24 16:00:00 | 2017-07-24 17:00:00 |
谁能告诉我如何在 SQL 中解决这个问题?
在此先感谢您的帮助。