SQL查询 - 如何根据时间避免“虚拟”重复记录

时间:2013-10-08 15:28:44

标签: mysql sql

如何执行一个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

任何帮助都会受到大力赞赏

2 个答案:

答案 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

希望这有帮助。