给定下表:
CREATE TABLE table
(
"id" serial NOT NULL,
"timestamp" timestamp without time zone NOT NULL,
"count" integer NOT NULL DEFAULT 0
)
我正在寻找“罕见事件”。罕见事件是拥有以下属性的行:
- 简单的:
count = 1
- 硬:10 分钟时间跨度内的所有行(在当前行的时间戳之前和之后)都有
count = 0
(当然,给定行除外)。
例子:
id timestamp count
0 08:00 0
1 08:11 0
2 08:15 2 <== not rare event (count!=1)
3 08:19 0
4 08:24 0
5 08:25 0
6 08:29 1 <== not rare event (see 8:35)
7 08:31 0
8 08:35 1
9 08:40 0
10 08:46 1 <== rare event!
10 08:48 0
10 08:51 0
10 08:55 0
10 08:58 1 <== rare event!
10 09:02 0
10 09:09 1
现在,我有以下 PL/pgSQL 函数:
SELECT curr.*
FROM gm_inductionloopdata curr
WHERE curr.count = 1
AND (
SELECT SUM(count)
FROM gm_inductionloopdata
WHERE timestamp BETWEEN curr.timestamp + '10 minutes'::INTERVAL
AND curr.timestamp - '10 minutes'::INTERVAL
)<2
这太慢了。:-(
关于如何提高性能的任何建议?我在这里处理 > 1 mio 行,可能需要定期查找那些“罕见事件”。