[英]Postgres column must appear in the GROUP BY clause or be used in an aggregate function
[英]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-postgresql和1769361 / 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;
您可以尝试两种简单的方法:
升级到Postgres 8.4.1
这两个查询在pg841下对我来说都很好
按顺序分组
也就是说,在这种情况下, GROUP BY 1
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.