使用PostgreSQL的不同日期和聚合函数

4
我正在尝试为每个月获取一组平均值。我使用DATE_TRUNC将日期时间转换为仅包含月年,但我仍无法使DISTINCT DATE起作用。它似乎完全忽略了它。
我只想要6行,即范围内的每个月一行,但我得到了成千上万行。
SELECT DISTINCT(date_trunc('month', event_logs.start_at)) AS start_at, 
AVG(event_logs.head_count) as head_count FROM "event_logs" 
WHERE ("event_logs"."state" IN ('completed')) AND ("event_logs"."start_at" 
BETWEEN '2013-05-09 10:12:58.824846' AND '2013-11-09') 
GROUP BY start_at

我也尝试使用 DISTINCT(DATE(date_trunc())),但似乎没有任何作用? 我是否遗漏了DATE的特殊之处?

+----+---------------------+---------------------------+
| id | head_count          | start_at                  |
+----+---------------------+---------------------------+
|    | 17.0                | 2013-06-01 01:00:00 +0100 |#WHY???!?!?!
|    | 15.0                | 2013-06-01 01:00:00 +0100 |#YOU ARE CLONES!
|    | 40.5                | 2013-06-01 01:00:00 +0100 |#NOT DISTINCT!
|    | 32.5                | 2013-10-01 01:00:00 +0100 |
|    | 69.0                | 2013-08-01 01:00:00 +0100 |
|    | 34.9                | 2013-10-01 01:00:00 +0100 |
|    | 9.0                 | 2013-07-01 01:00:00 +0100 |

你的 GROUP BY start_at 是按照原始时间戳进行分组,而不是按照日期聚合后的时间戳进行分组。 - wildplasser
1个回答

5

试试这个:

SELECT
date_trunc('month', event_logs.start_at) AS start_at, 
AVG(event_logs.head_count) as head_count 
FROM "event_logs" 
WHERE ("event_logs"."state" IN ('completed')) 
AND ("event_logs"."start_at" 
BETWEEN '2013-05-09 10:12:58.824846' AND '2013-11-09') 
GROUP BY date_trunc('month', event_logs.start_at)

你的问题在于GROUP BY语句。你需要按照月份进行分组而不是日期/时间值。而且你不需要在GROUP BY中使用DISTINCT。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接