在 Postgres (Redshift) 中使用两个选择列运行 MAX 聚合查询时出现问题

Posted

技术标签:

【中文标题】在 Postgres (Redshift) 中使用两个选择列运行 MAX 聚合查询时出现问题【英文标题】:Problems when running MAX aggregate query in Postgres (Redshift) with two select columns 【发布时间】:2020-07-02 00:52:09 【问题描述】:

我正在尝试在 Redshift 表上运行这个简单的查询:

select
    max(id),
    created_date
    from records.access_monitoring
    where created_date < to_timestamp('2020-05-19 16:00:00', 'YYYY-MM-DD HH24:MI:SS')

这只是给出了“2020-05-19 16:00:00”之前日期的 ID 的最大值。 当我针对 mysql 表运行此查询时,它运行良好,但是,我在 Redshift 中拥有的同一张表给出了这个错误:

无效操作:必须出现列“access_monitoring.created_date” 在 GROUP BY 子句中或在聚合函数中使用;

但是,如果在 Redshift 中运行查询而不选择 created_date,它可以正常工作:

select
      max(set_id)
    from records.access_monitoring
    where created_date < to_timestamp('2020-05-19 16:00:00', 'YYYY-MM-DD HH24:MI:SS')

这是与 Postgres 相关的问题还是特定于 Redshift 的问题?

【问题讨论】:

【参考方案1】:

您的查询也不应该在 MySQL 中工作,因为您有一个没有 group by 和未聚合列的聚合查询。查询格式错误。

改为使用order bylimit

select id, created_date
from records.access_monitoring
where created_date < '2020-05-19 16:00:00'
order by id desc
limit 1;

这应该适用于任一数据库。

【讨论】:

非常感谢。实际上,我在 MySQL (Aurora) 上运行了它,它确实有效。有道理,它不应该,但它确实做到了。谢谢你。只是为了确保,order by 子句应该是id,对吗?因为我想要 max(id)? @madu 。 . .旧版本的 MySQL 允许这种语法,返回任意的created_date。是的 。 . .我误读了逻辑。 order by 应该是 id

以上是关于在 Postgres (Redshift) 中使用两个选择列运行 MAX 聚合查询时出现问题的主要内容,如果未能解决你的问题,请参考以下文章

带有 Redshift 的 Postgres 外部模式:我可以使用外部数据包装器吗?

使用 java 程序从 STDIN 复制 Redshift

将 Postgres RDS 模式复制到 Redshift

如何在 Redshift 或 Postgres 的视图中获取列依赖关系?

Postgres/Redshift DATEDIFF 转换为 FLOAT

将一张表从 RDS / postgres 加载到 Redshift