如何执行一个sql查询,该查询将返回表中除了与另一条记录的差异小于2秒的记录之外的所有记录?
示例 - 考虑以下5条记录:
16:24:00
16:24:10
16:24:11
16:24:12
16:24:30
查询应返回:
16:24:00
16:24:10
16:24:30
任何帮助都会受到大力赞赏
答案 0 :(得分:1)
最佳解决方案 - 对您的时间戳进行编号和排序,仅在连续记录上自行加入3秒或更长时间:
select a.* from (
select timestamp,
@curRow := @curRow + 1 AS row_number
from table
JOIN (SELECT @curRow := 0) r
order by timestamp
)a inner join (
select timestamp,
@curRow := @curRow + 1 AS row_number
from table
JOIN (SELECT @curRow := 0) r
order by timestamp
)b on time_to_sec(a.timestamp)<time_to_sec(b.timestamp)-2 and
a.row_number=b.row_number-1
每3秒获得不超过一次,将其分成3秒间隔并按此分组,使用min()
获取最低现有值(如果存在)select min(timestamp)
from table
group by concat(left(timestamp, 6),3*round(right(timestamp, 2)/3))
答案 1 :(得分:1)
前一段时间我遇到过类似的问题。
这是我想出来的,而且效果很好。
予。此查询将“your_table”(此处称为x)的所有结果分组5秒。 这意味着它将输出5秒钟内的结果计数。
SELECT count(x.id), x.created_at FROM your_table AS x GROUP BY ( 60 * 60 * HOUR( x.created_at ) + 60 * FLOOR( MINUTE( x.created_at )) + FLOOR( SECOND( x.created_at ) / 5))
II。此查询将“your_table”(此处称为x)的所有结果分组1分钟。 如上所述,它将输出1分钟时间范围内的结果计数。
SELECT count(x.id), x.created_at FROM your_table AS x GROUP BY ( 60 * HOUR( x.created_at ) + FLOOR( MINUTE( x.created_at ) / 1))
查询I和输入的示例输出。
count(x.id), created_at
1 16:24:00
3 16:24:10
1 16:24:30
希望这有帮助。