在 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 by
和limit
:
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 外部模式:我可以使用外部数据包装器吗?
如何在 Redshift 或 Postgres 的视图中获取列依赖关系?