将MySQL查询转换为Postgres时出错

时间:2019-08-23 11:46:30

标签: mysql sql postgresql

以下查询在MySQL中有效:

SELECT
  f.created_date as time_sec
  ,sum(f.value) as value
  , date_format( f.created_date , '%a') as metric
FROM ck_view_fills as f
GROUP BY date_format(f.created_date, '%a' )

我已经将数据库迁移到PostgreSQL,现在正在转换查询以使其匹配。我的幼稚转换看起来像这样:

SELECT
  f.created_date as time_sec
  ,sum(f.value) as value
  , to_char( f.created_date , "D") as metric
FROM ck_view_fills as f
GROUP BY to_char( f.created_date , "D")

该查询不被接受,PostgreSQL生成的错误消息如下:

  

查询(7)中的错误:错误:列“ f.created_date”必须出现在   GROUP BY子句或在聚合函数第2行中使用:   f.created_date作为time_sec

据我所知,在group by子句中确实使用了f.created_date。我也看到了使用这种语法的示例。那么导致此错误的原因是什么,我该如何解决呢?

1 个答案:

答案 0 :(得分:2)

Postgres是正确的。实际上,如果使用最新版本的MySQL,您的查询也会失败-使用默认设置。

只需使用聚合函数:

SELECT MIN(f.created_date) as time_sec,
       SUM(f.value) as value
       TO_CHAR(f.created_date, 'D') as metric
FROM ck_view_fills f
GROUP BY to_char(f.created_date , 'D');

您应该在MySQL中使用类似的构造(关于MIN()MAX())。