SQL усредняет несколько периодов времени одного и того же набора данных - PullRequest
2 голосов
/ 13 сентября 2010

У меня следующий запрос:

SELECT AVG(val) from floatTable
WHERE tagindex IN(1,2,3,4)
AND DateAndTime > '$first_of_year'

Возвращает среднее значение для всех значений, измеренных для этих четырех тегов за год до даты. Поскольку я уже получаю эти данные, как я могу получить данные с первого числа месяца, с первой недели и с полуночи? У меня уже есть эти даты, рассчитанные как $ first_of_month, $ first_of_week и $ midnight. Я пытаюсь свести к минимуму запрос и надеялся, что кто-нибудь может помочь мне собрать немного магии SQL, чтобы вернуть эти данные в виде одного запроса или оптимизированного набора запросов. Этот запрос занимает в среднем 300 секунд, поэтому я хочу сделать это как можно меньше.

Заранее спасибо.

1 Ответ

5 голосов
/ 13 сентября 2010
SELECT AVG(case when DateAndTime > '$first_of_year' then val end) as FirstOfYear,
       AVG(case when DateAndTime > '$first_of_month' then val end) as FirstOfMonth,
       AVG(case when DateAndTime > '$first_of_week' then val end) as FirstOfWeek,
       AVG(case when DateAndTime > '$midnight' then val end) as Midnight
from floatTable 
WHERE tagindex IN(1,2,3,4) 
    and DateAndTime > '$first_of_year' 

Для повышения производительности убедитесь, что у вас есть индексы для столбцов DateAndTime и tagIndex.

...