SQL平均同一数据集的多个时间段

use*_*199 2 sql optimization average query-optimization

我有以下查询:

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

它返回到目前为止年份的四个标签测量的所有值的平均值.由于我已经检索过这些数据,如何从本周的第一天起,从本周的第一天开始,从午夜开始,我如何获取数据?我已将这些日期计算为$ first_of_month,$ first_of_week和$ midnight.我正在尝试最小化查询,并希望有人可以帮助我掀起一些SQL魔法,以便在单个查询或优化的查询集中返回此数据.此查询平均需要300秒,因此我希望尽可能少地执行此操作.

先感谢您.

Red*_*ter 5

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' 
Run Code Online (Sandbox Code Playgroud)

为了提高性能,请确保您有列的索引DateAndTimetagIndex.