MySQL:SELECT行包含行之间具有重叠时间的MAX的行

时间:2017-01-26 21:29:13

标签: mysql sql

时间跨度:

+-----+-------+-------+-------------+
| 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)

2 个答案:

答案 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覆盖整个表,

我认为这就是你想要做的事,如果我错过了解你想要实现的道歉。