我使用以下内容返回基于“服务器”的最新唯一记录列表
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
是否有更有效的方法来执行此类查询?
答案 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。使用date
,time
等保留字来表示列名是个坏主意。
答案 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
上可以使用大量日期功能