2013-11-09 2 views
4

Я пытаюсь получить набор средних значений за каждый месяц. Я использую DATE_TRUNC, чтобы преобразовать дату в месяц только в месяц, но я все еще не могу заставить отличную DATE работать. Кажется, игнорировать его полностью.Использование отдельных дат и агрегатных функций с postgres

Я хочу только 6 строк, по одному для каждого месяца в RANGE, но вместо этого я получаю 1000. ?

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_trunc()), но это ничего не делать Есть ли что-то особенное с ДАТ я не видящих

+----+---------------------+---------------------------+ 
| 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 | 
+0

Группы 'GROUP BY start_at' по исходной метке времени, а не по метрической метке даты – wildplasser

ответ

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 с GROUP BY

Смежные вопросы