代码之家  ›  专栏  ›  技术社区  ›  Straff

postgres-select/group by-column中的分部列必须出现在group by子句中或在聚合函数中使用

  •  0
  • Straff  · 技术社区  · 15 年前

    以下两个语句都会在Postgres中产生错误:

    SELECT substring(start_time,1,8) AS date, count(*) as total from cdrs group by date;
    SELECT substring(start_time,1,8) AS date, count(*) as total from cdrs group by substring(start_time,1,8);
    

    错误是:

    “cdrs.start_time”列必须出现在group by子句中或被使用 在聚合函数中

    我对Postgres文档的理解是,select和group by都可以使用 表达 postgres 8.3 SELECT

    “开始时间”字段是一个字符串,其日期/时间格式为ccyymmddhhmmss。在MySQL中,它们都会产生预期和期望的结果:

    +----------+-------+
    | date     | total |
    +----------+-------+
    | 20091028 |     9 |
    | 20091029 |   110 |
    | 20091120 |    14 |
    | 20091121 |     4 |
    +----------+-------+
    4 rows in set (0.00 sec)
    

    我要坚持Postgres(Heroku)。有什么建议吗?

    另外,还有很多其他的讨论,讨论GroupBy中缺少的项目,以及为什么MySQL接受这个,为什么其他人不接受…严格遵守SQL规范等,但我认为这与 1062158/converting-mysql-select-to-postgresql 1769361/postgresql-group-by-different-from-mysql 提出一个单独的问题。

    3 回复  |  直到 15 年前
        1
  •  4
  •   user80168    15 年前

    你做了一些你在问题中没有描述的事情,因为你的两个查询都很好。8.5和8.3.8测试:

    # create table cdrs (start_time text);
    CREATE TABLE
    
    # insert into cdrs (start_time) values ('20090101121212'),('20090101131313'),('20090510040603');
    INSERT 0 3
    
    # SELECT substring(start_time,1,8) AS date, count(*) as total from cdrs group by date;
       date   | total
    ----------+-------
     20090510 |     1
     20090101 |     2
    (2 rows)
    
    # SELECT substring(start_time,1,8) AS date, count(*) as total from cdrs group by substring(start_time,1,8);
       date   | total
    ----------+-------
     20090510 |     1
     20090101 |     2
    (2 rows)
    
        2
  •  1
  •   Straff    15 年前

    总结一下,错误

    “cdrs.start_time”列必须出现在group by子句中,或在聚合函数中使用

    (在这种情况下)是由 ORDER BY start_time 条款。完整声明必须是:

    SELECT substring(start_time,1,8) AS date, count(*) as total FROM cdrs GROUP BY substring(start_time,1,8) ORDER BY substring(start_time,1,8);
    

        SELECT substring(start_time,1,8) AS date, count(*) as total FROM cdrs GROUP BY date ORDER BY date;
    
        3
  •  0
  •   pilcrow    15 年前

    您可以尝试两个简单的方法:

    1. 升级至Postgres 8.4.1
      两个查询 对我来说工作很好 (tm)根据PG841

    2. 按顺序位置分组
      也就是说, GROUP BY 1 在这种情况下。