postgresql中的按日期聚合函数分组

时间:2012-11-07 12:51:34

标签: postgresql group-by

我在运行此查询时遇到错误

SELECT date(updated_at), count(updated_at) as total_count 
FROM "persons"
WHERE ("persons"."updated_at" BETWEEN '2012-10-17 00:00:00.000000' AND '2012-11-07     12:25:04.082224') 
GROUP BY date(updated_at)
ORDER BY persons.updated_at DESC

我收到错误ERROR:列“persons.updated_at”必须出现在GROUP BY子句中或用于聚合函数LINE 5:ORDER BY persons.updated_at DESC

如果我删除日期(逐个组中的功能,但我使用日期功能,因为我想按日期分组,而不是日期时间

任何想法

2 个答案:

答案 0 :(得分:17)

目前还不清楚你希望Postgres返回什么。你说它应该按persons.updated_at排序,但你不从数据库中检索该字段。

我想,你想做的是:

SELECT date(updated_at), count(updated_at) as total_count 
FROM "persons"
WHERE ("persons"."updated_at" BETWEEN '2012-10-17 00:00:00.000000' AND '2012-11-07     12:25:04.082224') 
GROUP BY date(updated_at)
ORDER BY count(updated_at) DESC -- this line changed!

现在,您明确告诉数据库按COUNT聚合的结果值进行排序。您还可以使用:ORDER BY 2 DESC,有效地告诉数据库按结果集中的第二列排序。但是,我非常希望明确说明该列。

注意我目前无法测试此查询,但我认为这应该有效。

答案 1 :(得分:5)

问题在于,由于您按date(updated_at)分组,updated_at的值可能不唯一,updated_at的不同值可以返回date(updated_at)的相同值}。您需要告诉数据库应该使用哪些可能的值,或者交替使用该组返回的值,可能是其中一个

SELECT date(updated_at) FROM persons GROUP BY date(updated_at)
ORDER BY date(updated_at)

SELECT date(updated_at) FROM persons GROUP BY date(updated_at)
ORDER BY min(updated_at)