2013-11-23 2 views
-1
SELECT date, id, sum(revenue) 
FROM table 
WHERE date between '2013-01-01' and '2013-01-08' 
GROUP BY date, id 
HAVING sum(revenue)>1000 

Возвращает строки с доходом> 1000.Эффективная группировка по столбчатому агрегату

SELECT date, id, sum(revenue) 
FROM table 
WHERE date between '2013-01-01' and '2013-01-08' 
AND id IN (SELECT id FROM table where date between '2013-01-01' and '2013-01-08' GROUP BY id HAVING sum(revenue)>1000) 
GROUP BY date, id 

Возвращает строки для идентификаторов, общий доход которых за период даты составляет> 1000 по желанию. Но этот запрос намного медленнее. Любой более быстрый способ сделать это?

+0

Как насчет 'EXPLAIN' первым? – zerkms

+0

@ChrisArmstrong эти запросы возвращают разные результаты ??? –

ответ

1

Убедитесь, что индексы в date и id столбцах, и попробовать этот вариант:

select t.date, t.id, sum(t.revenue) 
from table t 
inner join (
    select id 
    from table 
    where date between '2013-01-01' and '2013-01-08' 
    group by id 
    having sum(revenue) > 1000 
) ts on t.id = ts.id 
where t.date between '2013-01-01' and '2013-01-08' 
group by t.date, t.id 
+0

Современный оптимизатор mysql создаст тот же (или * очень похожий) план выполнения для обоих из них – zerkms

+0

Btw, op не нуждается в * индексах *, а в одном составном индексе '(date, id)'. Или даже может быть индексом '(дата, идентификатор, доход)', стоит также попробовать – zerkms

+0

@zerkms - ваш составной индекс не помог бы внутреннему 'GROUP BY' или' JOIN', хотя и находится только на 'id '. Это расщепление волос, хотя, какие индексы действительно лучше всего зависят от данных, и нуждаются в реальном тестировании. Мое предложение было ориентиром, а не абсолютным. – RedFilter

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