Postgresql,基于唯一字段从表中获取最新条目

Postgresql,基于唯一字段从表中获取最新条目,sql,postgresql,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; 有没有更有效的方法来执行这种类型的查

我使用以下命令返回基于服务器的最新唯一记录列表

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;

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

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

select distinct ON (server) server, fail, date, time
from querytimes
order by server, date desc, time desc;
如果速度不够快,请尝试在服务器、日期和时间上添加索引


另外,在列名中使用保留字如date、time是个坏主意。

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

select distinct ON (server) server, fail, date, time
from querytimes
order by server, date desc, time desc;
如果速度不够快,请尝试在服务器、日期和时间上添加索引


另外,在列名中使用日期、时间等保留字是一个坏主意。

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

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

有很多日期函数可供使用,如果您想要的所有记录都是最新的,您可以通过首先将搜索空间限制为小于x分钟的记录来减少所涉及的记录量—可能使用公共表表达式从庞大的表中筛选出记录子集,然后对较小的记录集进行真正的查询

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


可以使用大量的日期函数,自排除联接的性能与您针对这个小数据集的解决方案大致相同:但从两个解释计划来看,自排除联接的成本较低,因此可能不影响试用。@bernie 2 seq scans+join Rarry可能比1 seq scan and sort更好。如果创建一个复合索引服务器,日期,时间?编辑:对不起,我知道Igor已经提出了这一点。自排除联接的性能与您针对这个小数据集的解决方案大致相同:但从两个解释计划来看,自排除联接的成本较低,因此可能不会影响尝试。@bernie 2 seq scans+join Rarry可能比1 seq scan and sort更好。如果创建一个复合索引服务器,日期,时间?编辑:对不起,我看到Igor已经提出了这个建议。谢谢,这帮了我大约3秒钟的时间。我将研究更新这些列名。每分钟我都会为每个服务器向该表添加新数据。我可以这样做吗,从querytimes中选择服务器、失败、日期、时间按日期顺序描述、时间描述限制100;然后对结果进行排序,使其对服务器是唯一的,只需2秒,而不是19秒。如果我知道我有44台服务器,我可以得到100台最新的服务器,以防在查询过程中添加内容。从querytimes中选择distinct ON server,fail,date,time from querytimes,其中date>CURRENT_date-1 order by server,date desc,time desc;谢谢,这帮了我3秒钟的时间。我将研究更新这些列名。每分钟我都会为每个服务器向该表添加新数据。我可以这样做吗,从querytimes中选择服务器、失败、日期、时间按日期顺序描述、时间描述限制100;然后对结果进行排序,使其对服务器是唯一的,只需2秒,而不是19秒。如果我知道我有44台服务器,我可以得到100台最新的服务器,以防在查询过程中添加内容。从querytimes中选择distinct ON server,fail,date,time from querytimes,其中date>CURRENT_date-1 order by server,date desc,time desc;谢谢,这就是我最后添加的内容,WHERE date>CURRENT_date-1Did每个服务器只需要一行吗?我可能会想出一种方法,用一个嵌套的CTE来实现这一点:是的,我希望在一个网页上报告每个服务器的最后状态,它是否失败。这就是我想要快速响应的原因。理想情况下,如果数据库条目在您的控制下,您可以只使用另一个表LastQueries,每台服务器仅一行,每次向QueryEntries添加条目时更新和覆盖该表。然后,您可以从LastQueries中选择*。一切都在我的控制之下。这是一个添加新表的好主意。以前从未做过更新。这看起来是正确的更新方式吗。更新newtable SET fail='no',ms='0.2123',time=10:23:21,date=02-21-2013其中server='serv1.test.com'?谢谢,我最后做的是添加,其中date>CURRENT_date-1Did每个服务器只需要一行吗?我可能会想出一种方法,用一个嵌套的CTE来实现这一点:是的,我希望在一个网页上报告每个服务器的最后状态,它是否失败。这就是我想要快速响应的原因。理想情况下,如果数据库条目在您的控制下,您可以只使用另一个表LastQueries,每台服务器仅一行,每次向QueryEntries添加条目时更新和覆盖该表。然后,您可以从LastQueries中选择*。一切都在我的控制之下。增加新的助教真是个好主意 可悲的。以前从未做过更新。这看起来是正确的更新方式吗。更新新表集失败='no',ms='0.2123',时间=10:23:21,日期=02-21-2013,其中服务器='serv1.test.com'?