时间跨度:
+-----+-------+-------+-------------+
| ID | start | stop | value |
+-----+-------+-------+-------------+
| 1 | 1:00 | 3:00 | 6 |
| 2 | 5:00 | 9:00 | 3 |
| 3 | 6:00 | 10:00 | 1 |
+-----+-------+-------+-------------+
这是我想要的输出:
+-----+-------+-------+-------------+
| ID | start | stop | value |
+-----+-------+-------+-------------+
| 1 | 1:00 | 3:00 | 6 |
| 2 | 5:00 | 9:00 | 3 |
+-----+-------+-------+-------------+
如果开始和停止时间戳重叠(如第2行和第3行所示),我希望在两者之间包含MAX()
value
的行。
如果有助于澄清,可以采取以编程方式解决此问题的方法:
sort(timespans) // by 'value', highest first
results = []
for (t in timespans)
for (row in results)
overlap =
(row.start < t.start && t.start < row.stop) // t.start within row
|| (row.start < t.stop && t.stop < row.stop) // t.stop within row
|| (t.start < row.start && row.stop < t.stop) // t encapsulates row
if (!overlap)
results.push(t)
答案 0 :(得分:1)
您可以使用EXISTS
检查是否有另一行包含重叠的start
/ stop
值和更高的value
值。
这样的事情:
select t1.id, t1.start, t1.stop, t1.value
from your_table t1
where not exists (
select NULL
from your_table t2
where ((t2.start between t1.start and t1.stop) or (t2.stop between t1.start and t1.stop))
and t2.value > t1.value
)
答案 1 :(得分:-1)
据我所知,这里有限的信息我可能会使用IF()语句来查找任何重叠并将记录合并为一个, 所以从table_Name调用sql SELECT *并将其保存到assoc 然后在记录上运行循环,查看time_a&lt; time_b 所以time_a是=在记录1中停止time_b = =开始记录2。 也许不是IF()可能是for循环然后在大括号中复制记录1和记录2中的信息并制作一条记录,其中起始点来自记录1,而stop来自记录2,删除来自您的assoc的2条记录并替换为闪亮的新记录然后使用sql INSERT INTO覆盖整个表,
我认为这就是你想要做的事,如果我错过了解你想要实现的道歉。