我怎样才能做一个 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
任何帮助将不胜感激
最佳解决方案 - 对您的时间戳进行编号和排序,仅在连续记录上 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))
不久前我遇到了类似的问题。
这是我想出的,效果很好。
I. 此查询将 '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))
二、此查询将“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
希望这可以帮助。