这应该有效:
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
查询的前面,这可能会提高查询性能(尽管如此,您应该测试一下,只是看一下两个版本的解释的直觉)
以下是它的工作原理:
它选择整个表两次,并将 的每一行offset_start
与offset_end
偏移量为的行连接起来@num_occurences
。(这是使用@rownum_*
变量来创建每行的索引,模拟其他 rdbms 已知的 row_number() 功能)。
然后它只是检查两行是否引用相同的 object_id 并满足周期要求。
由于对每个出现的行都执行此操作,因此如果出现的次数实际上大于 ,则 object_id 将被多次返回@max_occurences
,因此最后将其分组以使返回object_id
的 s 唯一