2014-11-07 2 views
0

У меня есть таблица с тремя столбцами: place_id, date, value. Для каждого места для каждой даты есть значение, например
Sql Postgres double group

place_id: 1, дата: '2014-01-01', значение: 1
place_id: 2, дата: '2014-01-01', стоимость: 2
place_id: 1, дата: '2014-02-02', значение: 3
place_id: 1, дата: '2014-02-03', value: 4
place_id: 2, date: ' 2014-02-15 ', значение: 5

Моя цель - найти для каждого месяца сумму максимального значения для всех мест. В контексте приведенных выше данных он должен выглядеть (неважно, как дата должна отображаться как: в качестве двух столбцов год и месяц или один столбец «yyyy-MM-01»):

дата: '2014 -01-01' , sum_of_max: 3
дата: „2014-02-01“, sum_of_max: 9

Как я получил, я должен использовать группу в два раза - во-первых, чтобы получить максимальное значение за месяц и место , во-вторых, чтобы суммировать максимумы, которые я получил на первом шаге. Но каким образом я могу сделать это с наилучшей производительностью?

P.S. Если это случилось, я использую PostGreSQL 9,2

ответ

4

Я дону Не вижу хороших альтернатив использованию подзапроса. Функция Postgres datetrunc() может помочь с группировкой значений из вашей базовой таблицы по месяцам, так как кажется, что вы хотите сделать.

SELECT month, SUM(max_value) AS sum_of_max 
FROM (
    SELECT place_id, date_trunc('month', date) AS month, MAX(value) AS max_value 
    FROM my_table 
    GROUP BY place_id, month 
) mx 
GROUP BY month 
+0

Я думаю, что для внутреннего запроса нужен псевдоним. Нет? –

+0

@AdrianMatteo, да. добавлено. –

1

Одним из способов является подзапрос с двумя group by:

select mm, sum(maxvalue) 
from (select place_id, date_trunc('month', date) as mm, max(value) as maxvalue 
     from table t 
     group by place_id, date_trunc('month', date) 
    ) t 
group by mm; 

Использование distinct on в подзапроса, вероятно, даст лучшую производительность:

select mm, sum(maxvalue) 
from (select distinct on (place_id, date) place_id, date_trunc('month', date) as mm, 
      max(value) as maxvalue 
     from table t 
     order by place_id, date_trunc('month', date), value desc 
    ) t 
group by mm; 
Смежные вопросы