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

时间:2010-09-13 18:12:26

标签: sql optimization query-optimization average

我有以下查询:

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 个答案:

答案 0 :(得分: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' 

要提高效果,请确保列DateAndTimetagIndex上有索引。