別のレコードとの差が 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
どんな助けでも大歓迎です
少し前に同様の問題がありました。
これが私が思いついたもので、非常にうまく機能します。
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
お役に立てれば。
最良の解決策 - タイムスタンプに番号を付けて並べ替え、連続したレコードでのみ 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))