18

运行此查询时出错

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

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

如果我通过调用从组中删除 date( 函数,则此方法有效,但是我正在使用 date 函数,因为我想按日期分组,而不是按日期时间分组

有任何想法吗

4

2 回答 2

31

目前尚不清楚您希望 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,有效地告诉数据库按结果集中的第二列排序。但是,为了清楚起见,我非常喜欢明确说明该列。

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

于 2012-11-07T12:57:59.047 回答
6

问题是,因为您是按 分组date(updated_at),所以值updated_at可能不是唯一的,不同的值updated_at可以返回相同的值date(updated_at)。您需要告诉数据库它应该使用哪些可能的值,或者使用 group by 返回的值,可能是其中之一

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)
于 2012-11-07T13:09:21.450 回答