これはうまくいくはずです:
SET @num_occurences = 7; -- how many occurences should occur in the interval
SET @max_period = 10; -- your interval in seconds
SELECT offset_start.object_id FROM
(SELECT @rownum_start := @rownum_start+1 AS idx, object_id, seen_timestamp
FROM occurences, (SELECT @rownum_start:=0) r ORDER BY object_id ASC, seen_timestamp ASC) offset_start
JOIN
(SELECT @rownum_end := @rownum_end + 1 AS idx, object_id, seen_timestamp
FROM occurences, (SELECT @rownum_end:=0) r ORDER BY object_id ASC, seen_timestamp ASC) offset_end
ON offset_start.object_id = offset_end.object_id
AND offset_start.idx + @num_occurences - 1 = offset_end.idx
AND offset_end.seen_timestamp - offset_start.seen_timestamp <= @max_period
GROUP BY offset_start.object_id;
コードに移動@num_occurences
し@num_occurences
て、これらをステートメントのパラメーターとして設定できます。@rownum_start
クライアントによっては、クエリの初期化をクエリの前に移動することもできます@rownum_end
。これにより、クエリのパフォーマンスが向上する可能性があります(ただし、両方のバージョンの説明を見て直感的にテストする必要があります)
仕組みは次のとおりです。
テーブル全体を 2 回選択offset_start
し、 の各行をoffset_end
のオフセットを持つ行と結合し@num_occurences
ます。(これは、@rownum_*
変数を使用して各行のインデックスを作成し、他の rdbms で知られている row_number() 機能をシミュレートして行われます)。
次に、2 つの行が同じ object_id を参照しており、期間の要件を満たしているかどうかを確認します。
これはオカレンス行ごとに行われるため、オカレンス数が実際に より大きい場合、object_id は複数回返されるため、返されるs を一意@max_occurences
にするために最後にグループ化されます。object_id