1

我怎样才能做一个 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

任何帮助将不胜感激

4

2 回答 2

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))
于 2013-10-08T15:39:04.287 回答
1

不久前我遇到了类似的问题。

这是我想出的,效果很好。


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

希望这可以帮助。

于 2013-10-08T16:19:27.300 回答