如何获取PostgreSQL中同一列多个值的最新记录?
我有一个具有以下结构的数据库如何获取PostgreSQL中同一列多个值的最新记录?,sql,postgresql,select,Sql,Postgresql,Select,我有一个具有以下结构的数据库 url update_time dns_time ------------------------------- url1 2013-04-05 08:03:23 0.897 url2 2013-09-03 08:03:45 0.765 url1 2013-08-23 09:23:34 2.457 url3 2013-08-34 09:45:47 1.456 //
url update_time dns_time
-------------------------------
url1 2013-04-05 08:03:23 0.897
url2 2013-09-03 08:03:45 0.765
url1 2013-08-23 09:23:34 2.457
url3 2013-08-34 09:45:47 1.456
//and so on
现在我只想检索每个url的最新记录。如何使用PostgreSQL选择查询实现这一点
我试着用
select url,
update_time,
dns_time
from dns_lookup_table
where url in('url1','url2','url3')
order by desc limit 1
但它给了我url3的最新值,这是最后一条记录。我尝试使用desc limit 3获取所有3个URL的最新值。我想检索url1、url2、url3的最新记录。只有最新的记录。表
dns\u lookup\u table
具有动态进入的记录。有时,如果url记录不可用,则无法插入。所以秩序缺失了。因此,我认为使用desc limit
是不可能的,您可以使用窗口函数获取每个URL的最新行:
select *
from (
select url,
update_time,
dns_time,
row_number() over (partition by url order by update_time desc) as rnk
from dns_lookup_table
) as t
where rnk = 1
SQLFiddle示例:
编辑 您也可以使用类似以下内容:
select *
from dns_lookup_table lt
join (
select url,
max(update_time) as latest_time
from dns_lookup_table
group by url
) as mt on mt.latest_time = lt.update_time
and mt.url = lt.url;
更新时间的类型是什么?你说的“顺序缺失”到底是什么意思?如果我使用desc limit 5,url的顺序将缺失。如果记录不可用,则url未插入数据库更新时间是postgresql中的时间戳类型,我使用的是postgresql 9.0version@user2515189:然后窗口功能将工作。您可能复制了错误的代码。你能上传一个样本来说明问题吗。
SELECT *
FROM dns_lookup_table lut
WHERE NOT EXISTS (
SELECT *
FROM dns_lookup_table nx
WHERE nx.url = lut.url
AND nx.update_time > lut.update_time
);