Postgresql,根据唯一字段从表中获取最新条目

时间:2013-02-21 16:35:59

标签: sql postgresql

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

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

是否有更有效的方法来执行此类查询?

2 个答案:

答案 0 :(得分:4)

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

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

如果速度不够快,请尝试在(server,date,time)上添加索引。

P.S。使用datetime等保留字来表示列名是个坏主意。

答案 1 :(得分: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

上可以使用大量日期功能