【问题标题】:PostgreSQL query using subquery is giving exception使用子查询的 PostgreSQL 查询给出异常
【发布时间】:2013-07-01 05:26:14
【问题描述】:

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

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

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

【问题讨论】:

标签: postgresql select max


【解决方案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_timeupdate_timetext 的文本转换进行比较。这没有任何意义。你为什么还要尝试将update_time 与它自己进行比较呢?也许你打算做一个子查询FROM另一个表?如果是这样,您通常最好进行简单的连接。

您进一步的 cmets 表明您确实想要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 创建的范围。

【讨论】:

  • 给我例外:运营商不存在:带时区的时间戳 = 文本:从 dns_lookup_table 中选择 url、dns_time、update_Time where url in('url1', 'url2','url3') 和 update_time =max((选择to_char(update_time,'YYYY-MM-DD HH24:MI')))
  • @user2515189 答案已更新。您的查询完全没有意义。
  • 我想要最新的记录。但是我对每个 url 使用相同的 update_time。但是 java 程序在运行所有 url 时可能会有秒数不同,但是日期的分钟和小时可能是相同的。所以我正在提取最多几分钟的时间来获取每个 url 的最新记录。
  • @user2515189 考虑发布一个新问题,解释您要解决的问题,包括架构定义、示例数据和预期结果。请参阅stackoverflow.com/tags/postgresql/info 的“提出更好的问题”部分。听起来你可能想要date_trunc,但很难说。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-09
  • 1970-01-01
  • 2013-10-11
  • 2018-06-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多