【发布时间】:2011-03-17 20:13:46
【问题描述】:
我想要一种简单的方法来对我的时间序列数据运行如下查询:
“相隔 7 天内最典型的事件是什么”?
我可以通过使用 SQL 和 Java 程序来做到这一点,通过查看每一行并运行一个查询,该查询会在 7 天之前或之后查找所有事件,但这不是很优雅,而且性能会很糟糕。
我还得到了 JNK 和 Milen A. Radev 的帮助来编写以下 SQL。我的问题是,当我在 2300 万行上测试它时,它运行了两个小时并停止了,因为我的 RamDisk(我运行 PostgreSQL 数据库的地方)已满。您知道如何优化这样的查询吗?
SELECT a.eventID, b.eventID, COUNT(*)
FROM table a
INNER JOIN table b
ON a.eventID <> b.eventID
WHERE aBS(EXTRACT(EPOCH FROM (a.thetimeanddate - b.thetimeanddate))) < 5
GROUP BY a.eventID, b.eventID
ORDER BY COUNT(*) DESC
LIMIT 1000;
【问题讨论】:
-
您的查询不“查找早于或晚 7 天的事件”。它只是返回表 a 中在表 be 中具有匹配行的 所有 行,并计算两列之间的差异。
-
@a_horse_with_no_name 你完全正确。我选择了错误的 SQL 查询。我已经更新了我的问题。
-
@David:你确定
ON a.eventID <> b.eventID条件吗?这不会连接相应的行,并且可能会生成巨大的结果集。 -
@a_horse_with_no_name 我同意这是一个非常广泛的连接,但我不知道如何使其更具限制性。使用 where 子句减少了最终输出,但也许我应该移动 where 子句使其成为连接条件的一部分?
-
@David:你确定不想要
ON a.eventID = b.eventID吗?
标签: sql postgresql