2016-11-18 4 views
0

У меня есть таблица, в которой мне нужно выбрать из всего этого правила:Postgres производительность внутренний запрос

id = 4524522000143 and validPoint = true 
and date > (max(date)- interval '12 month') 
-- the max date, is the max date for this id 

Объясняя правила: Я должен получить все регистры и сосчитать их, они должны быть не менее 1 года старый из новейшего регистра.

Это мой фактический запрос:

WITH points as (
    select 1 as ct from base_faturamento_mensal 
    where id = 4524522000143 and validPoint = true 
    group by id,date 
    having date > (max(date)- interval '12 month') 
) select sum(ct) from points 

Есть ли более эффективный способ для этого?

ответ

2

Ну, ваш запрос использует трюк с включением неагрегированного столбца в пределах HAVING, но я не считаю его особенно плохим. Кажется хорошо, но без вывода EXPLAIN ANALYZE <query> я не могу сказать гораздо больше.

Одна вещь, чтобы сделать это вы можете избавиться от КТР и использовать count(*) в том же запросе, вместо того, чтобы вернуться 1, а затем запустить sum на него впоследствии.

select count(*) as ct 
from base_faturamento_mensal 
where id = 4524522000143 
    and validPoint = true 
group by id, date 
having date > max(date) - interval '12 months' 
Смежные вопросы