Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql postgres-SELECT/GROUP BY-列中的partial列必须出现在GROUP BY子句中,或在聚合函数中使用_Sql_Mysql_Ruby On Rails_Postgresql_Heroku - Fatal编程技术网

Sql postgres-SELECT/GROUP BY-列中的partial列必须出现在GROUP BY子句中,或在聚合函数中使用

Sql postgres-SELECT/GROUP BY-列中的partial列必须出现在GROUP BY子句中,或在聚合函数中使用,sql,mysql,ruby-on-rails,postgresql,heroku,Sql,Mysql,Ruby On Rails,Postgresql,Heroku,以下两条语句都会在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

以下两条语句都会在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子句中,否则将被使用 在聚合函数中

我对博士后文档的理解是,SELECT和GROUP BY都可以使用表达式

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

+----------+-------+
| date     | total |
+----------+-------+
| 20091028 |     9 |
| 20091029 |   110 |
| 20091120 |    14 |
| 20091121 |     4 |
+----------+-------+
4 rows in set (0.00 sec)
我需要坚持博士后(heroku)。有什么建议吗


p、 在美国还有很多其他的讨论,讨论GroupBy中缺少的项,以及为什么mySQL接受这个,为什么其他人不接受。。。严格遵守SQL规范等,但我认为这与另一个问题有足够的不同,并有理由提出另一个问题。

您可以尝试两件简单的事情:

  • 升级到postgres 8.4.1
    在pg841下,这两个查询对我(tm)都很好

  • 按顺序位置分组
    也就是说,在这种情况下,
    按1分组


  • 您可以尝试两件简单的事情:

  • 升级到postgres 8.4.1
    在pg841下,这两个查询对我(tm)都很好

  • 按顺序位置分组
    也就是说,在这种情况下,
    按1分组


  • 您还做了一些在问题中没有描述的事情,因为您的两个查询都工作得很好。在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)
    

    您还做了一些在问题中没有描述的事情,因为您的两个查询都工作得很好。在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)
    

    总结一下,错误

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

    (在本例中)是由
    ORDER by start\u 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);
    


    总结一下,错误

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

    (在本例中)是由
    ORDER by start\u 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);
    


    重复:将语句移植到SQL Server、Oracle、SQLite时会得到相同的行为……这与1769361不同吗?该问题在GROUP BY VS SELECT中缺少列。但是这个问题在SELECT中显示了一个表达式,在GROUP BY中显示了同一个表达式。DISTINCT ON不会产生正确的结果。只是用sqlite做了一个测试,它会产生与mySQL相同的结果。。。sqlite>从fred中选择开始时间;20091020 20091020 20091020 20091021 20091021 20091021 20091031 20091031 20091031 20091031 20091031 20091031 20091031 sqlite>选择substr(开始时间,1,7)作为子日期,按substr(开始时间,1,7)将()作为fred组的总计;2009102 | 5 2009103 | 8 sqlite>选择substr(开始时间,1,7)作为子日期,按子日期将()作为fred组的总数;2009102 | 5 2009103 | 8 sqlite>Duplicate:将语句移植到SQL Server、Oracle、sqlite会得到相同的行为……这与1769361不同吗?该问题在GROUP BY VS SELECT中缺少列。但是这个问题在SELECT中显示了一个表达式,在GROUP BY中显示了同一个表达式。DISTINCT ON不会产生正确的结果。只是用sqlite做了一个测试,它会产生与mySQL相同的结果。。。sqlite>从fred中选择开始时间;20091020 20091020 20091020 20091021 20091021 20091021 20091031 20091031 20091031 20091031 20091031 20091031 20091031 sqlite>选择substr(开始时间,1,7)作为子日期,按substr(开始时间,1,7)将()作为fred组的总计;2009102 | 5 2009103 | 8 sqlite>选择substr(开始时间,1,7)作为子日期,按子日期将()作为fred组的总数;2009102 | 5 2009103 | 8 sqlite>re 1.,将在heroku升级时看到!重复2次,刚试过,同样的错误。谢谢。re.1.,将在heroku升级时查看!重复2次,刚试过,同样的错误。谢谢。非常正确,有一个“ORDER BY start\U time ASC”条款,我认为它可以简化示例,并且根据错误消息认为它是不相关的。不是这样。更改为“按日期订购ASC”或“按子字符串订购(开始时间,1,8)ASC”有效,并给出正确的结果。请注意,mySQL和sqlite都接受“ORDER BY start_time ASC”和其他两种格式。这是一条错误消息,但我应该在上面提供完整的查询。谢谢你的帮助。非常正确,有一个“ORDER BY start_time ASC”条款,我认为它可以简化示例,并且根据错误消息认为它是不相关的。不是这样。更改为“按日期订购ASC”或“按子字符串订购(开始时间,1,8)ASC”有效,并给出正确的结果。请注意,mySQL和sqlite都接受“ORDER BY start_time ASC”和其他两种格式。这是一条错误消息,但我应该在上面提供完整的查询。谢谢你的帮助。