1

我正在使用以下内容返回基于“服务器”的最新唯一记录列表

select server, fail, date, time
from (
    select server, fail, date, time,
           rank() over (partition by server order by date desc, time desc) as rank
    from querytimes
) dt
where dt.rank <= 1;

它可以工作,但是速度很慢。

时间:21470.742 毫秒

输出示例,

  server       | fail |    date    |   time
-------------------+------+------------+----------
serv1.test.com  | No   | 2013-02-21 | 10:25:03
serv2.test.com  | No   | 2013-02-21 | 10:25:03
serv3.test.com  | No   | 2013-02-21 | 10:25:03
serv4.test.com  | No   | 2013-02-21 | 10:25:03
serv5.test.com  | No   | 2013-02-21 | 10:25:03
serv6.test.com  | No   | 2013-02-21 | 10:25:03
serv7.test.com | No   | 2013-02-21 | 10:25:02
serv8.test.com | No   | 2013-02-21 | 10:25:01
serv9.test.com | No   | 2013-02-21 | 10:25:01
serv10.test.com | No   | 2013-02-21 | 10:25:02
serv11.test.com | No   | 2013-02-21 | 10:25:02
serv12.test.com | No   | 2013-02-21 | 10:25:02
serv13.test.com | No   | 2013-02-21 | 10:25:01
serv14.test.com | No   | 2013-02-21 | 10:25:01

有没有更有效的方法来做这种类型的查询?

4

2 回答 2

4

您可以尝试 PosgreSQL 特定DISTINCT ON子句,例如:

select distinct ON (server) server, fail, date, time
from querytimes
order by server, date desc, time desc;

如果速度不够快,请尝试在(server,date,time).

PS 使用保留字如date,time作为列名是一个坏主意。

于 2013-02-21T16:47:20.880 回答
0

只是一个想法 - 如果您想要的所有记录都是最近的,您可以通过首先将搜索空间限制为小于 x 分钟的记录来减少所涉及的记录数量 - 可能使用公用表表达式进行过滤从巨大的表中取出一个记录子集,然后对该较小的记录集进行真正的查询。

With MostRecent as
( SELECT * from querytimes WHERE ( ...Postgres code to get latest... )
)
SELECT ...yourquery... FROM MostRecent

http://www.postgresql.org/docs/7.4/static/functions-datetime.html可以使用大量的日期函数

于 2013-02-21T17:23:25.943 回答