繁体   English   中英

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

[英]postgres - partial column in SELECT/GROUP BY - column must appear in the GROUP BY clause or be used in an aggregate function

以下两个语句均在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

start_time字段是一个字符串,并具有格式为ccyymmddHHMMSS的日期/时间。 在mySQL中,它们都产生预期的结果:

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

我需要坚持使用Postgres(heroku)。 有什么建议么?

ps周围还有很多其他讨论,涉及GROUP BY中的缺失项以及为什么mySQL接受这一点,为什么其他人不……严格遵守SQL规范等,但我认为这与1062158 / converting-完全不同mysql-select-to-postgresql1769361 / postgresql-group-by-from-mysql有区别 ,需要单独提出一个问题。

您做了其他您未在问题中描述的事情,因为这两个查询都可以正常工作。 在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_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;

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

  1. 升级到Postgres 8.4.1
    这两个查询在pg841下对我来说都很好

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM