【发布时间】:2021-06-10 01:13:01
【问题描述】:
希望我能在这里找到我的难题的答案。
我在 Postgres 数据库中有两个表,我想在另一个上重叠。
表 A 有 3 列:“开始时间”、“结束时间”和“状态”。在每一行中,开始时间等于前一行的结束时间。
表 B 具有相同的列,但开始和结束时间不相邻且不重叠。
我想将表 B 重叠到表 A 上以创建表 C。
表 C 的每一行的开始时间也等于前一行的结束时间。
这是一个澄清的例子:
表 A - 重叠
| State | Start Time | End Time |
|---|---|---|
| 1 | 12:00:00 AM | 12:10:00 AM |
| 2 | 12:10:00 AM | 12:20:00 AM |
| 1 | 12:20:00 AM | 12:30:00 AM |
| 2 | 12:30:00 AM | 12:40:00 AM |
| 1 | 12:40:00 AM | 12:50:00 AM |
| 2 | 12:50:00 AM | 1:00:00 AM |
表 B - 重叠
| State | Start Time | End Time |
|---|---|---|
| 5 | 12:05:00 AM | 12:25:00 AM |
| 6 | 12:31:00 AM | 12:35:00 AM |
| 5 | 12:40:00 AM | 12:50:00 AM |
表 C - 重叠的结果
| State | Start Time | End Time |
|---|---|---|
| 1 | 12:00:00 AM | 12:05:00 AM |
| 5 | 12:05:00 AM | 12:25:00 AM |
| 1 | 12:25:00 AM | 12:30:00 AM |
| 2 | 12:30:00 AM | 12:31:00 AM |
| 6 | 12:31:00 AM | 12:35:00 AM |
| 2 | 12:35:00 AM | 12:40:00 AM |
| 5 | 12:40:00 AM | 12:50:00 AM |
| 2 | 12:50:00 AM | 1:00:00 AM |
如您所见,如果表 B 中某行的开始时间在表 A 中的某行时间范围内,则将表 A 中该行的结束时间替换为表 B 中该行的开始时间. 反之,如果B表中某行的结束时间在A表的某个时间范围内,则将A表中该行的开始时间替换为B表中该行的结束时间。
其次,如果表A和B中的开始时间和结束时间完全相同,那么B中的行就简单地替换A中的行。
第三,如果B表中某行的时间范围在A表中某行的时间范围内,则将A表行拆分为2行,第一行的结束时间为开始时间表 B 行,然后第二行的开始时间将是表 B 行的结束时间。
最后,必须在时间范围内正确保存状态。
是否可以使用 postgres sql 查询来完成此操作?我没有找到任何类似的问题或答案。
注意:为了简单起见,我在此处省略了每个表中的 ID 列,但如果它有助于实现重叠,则可以使用。
【问题讨论】:
标签: sql database postgresql time-series