【发布时间】:2010-09-14 02:52:42
【问题描述】:
我有以下疑问:
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 秒,所以我想尽量少做。
提前谢谢你。
【问题讨论】:
-
如果您不想对数据库进行太多往返,您可以简单地将这些平均值放在一个庞大的查询中的子查询中。据我的数学专业告诉我,平均值无法拆分或组合,因此您确实需要在不同的时间段内重新计算它们。
-
@Denis,请参阅 RedFilter 的回答。子查询不需要额外访问数据库,但将需要在查询中进行额外的逻辑读取 - 因此查询的总时间可能长达四倍。至于平均值,大多数版本的 SQL 在聚合计算中完全省略了 NULL 值 - 因此 RedFilter 查询中的四个不同表达式将被正确计算(因为不满足条件的值将被评估为 NULL)。
-
@Mark Bannister,在 RedFilter 发布他的答案的那一刻,我默默地承认了我的失礼,并立即从中吸取了教训,我想留下我的评论以供后人学习我的快速假设。
标签: sql optimization query-optimization average