-1

这是我的 postgres 查询(使用 postgres 9.0 版本),用于选择每个 url 的最新记录。我的 dns_lookup_table 包含不同时间每个 url 的不同值。

url1,url2,url3 是“文本”类型,update_time 是“带时区的时间戳”,dns_time 是“数字”类型。

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'));

请帮助我,我在“选择”处遇到语法错误

4

1 回答 1

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_timeto 的文本转换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.

于 2013-07-01T05:31:00.800 回答