我有一个具有以下结构的数据库
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
现在我想只检索每个网址的最新记录。如何使用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个网址的最新值。我想检索 url1 , url2 , url3 的最新记录。只有最新记录。表dns_lookup_table
具有动态进入的记录。有时,如果不可用,则无法插入URL记录。所以订单缺失了。所以我认为desc limit
无法实现。
答案 0 :(得分:4)
您可以使用窗口函数获取每个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示例:http://sqlfiddle.com/#!12/fbd38/1
修改的
您也可以使用以下内容:
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;
答案 1 :(得分:2)
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
);