这是我的postgres查询(使用postgres 9.0版本),用于选择每个网址的最新记录。我的dns_lookup_table包含不同时间的每个网址的不同值。
url1,url2,url3是'text'类型,update_time是'timestamp with timezone',dns_time是'numeric'类型。
select url,
dns_time,
update_Time
from dns_lookup_table
where url in('url1', 'url2','url3')
and update_time = max(select to_char(update_time,'YYYY-MM-DD HH24:MI'));
请帮助我,我在“选择”
时遇到语法错误答案 0 :(得分:1)
您正在使用不正确的子查询语法:
select url,dns_time,update_Time
from dns_lookup_table
where url in('url1', 'url2','url3')
and update_time=max(select to_char(update_time,'YYYY-MM-DD HH24:MI'));
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
您忘了将子查询括在括号中:
and update_time=max((select to_char(update_time,'YYYY-MM-DD HH24:MI')));
^ ^
|-------------- extra parens --------------------|
但是在这种情况下你根本不需要子查询,你可以通过简单的嵌套来调用函数:
and update_time=max(to_char(update_time,'YYYY-MM-DD HH24:MI'));
但是,这仍然是胡说八道。您正在将update_time
与update_time
到text
的文本转换进行比较。哪个没有意义。为什么你甚至试图将update_time
与自己进行比较呢?也许你打算做一个子查询FROM
另一张表?如果是这样,你通常最好不要做一个简单的连接。
您的进一步评论表明您确实需要date_trunc
。如果我猜错了你想要做的事情:
选择update_time
相同的所有行,忽略秒数,作为表格中最新的update_time
...然后你可以写:
SELECT url,dns_time,update_Time
FROM dns_lookup_table
WHERE url IN ('url1','url2','url3')
and date_trunc('minute',update_time) = (
SELECT date_trunc('minute', max(update_time))
FROM dns_lookup_table
WHERE url IN ('url1','url2','url3')
);
虽然这不会使用您在update_time
上为过滤器定义的任何索引。您需要在date_trunc('minute', update_time)
上创建索引,或者重新定义查询以使用BETWEEN
和从INTERVAL
创建的范围。