1

別のレコードとの差が 2 秒未満のレコードを除いて、テーブル内のすべてのレコードを返す SQL クエリを実行するにはどうすればよいですか?

例 - 次の 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

少し前に同様の問題がありました。

これが私が思いついたもので、非常にうまく機能します。


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 に答える
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 秒ごとに 1 つを超えないようにするには、それを 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 に答える