我有一个需要做的计算,如选择的数据按时间范围集合分组的平均值。
例子:
存储数据的表有几个主要列:
|时间戳外部id值|
现在我要计算20组(或更多)日期范围的平均值:
1)2000-01-01 00-00-00->2000-01-04 00-00-00
2)2000-01-04 00-00-00->2000-01-15 00-00-00
...
重要的是组之间没有间隙和交叉点,所以这意味着第一个日期和最后一个日期覆盖了整个时间范围。
另一个重要的事情是,在“date-from”到“date-to”的集合中,可以有用于集合外部的行(不需要的外部id)。
我尝试了两种方法:
1)使用SQL查询中的平均函数为每个“时间范围”步骤执行查询(但我不喜欢这样-对所有查询来说,这耗费了太多时间,而且执行多个查询听起来不太好)
2)我选择了所有必需的行(在一个SQL请求下),然后对结果进行循环。问题是我必须检查“数据组”当前日期时间所属的每个步骤。这看起来是一种更好的方法(从SQL的角度来看),但是现在由于循环中的循环,我没有太好的性能。我需要找出如何避免在主循环中执行循环(检查当前时间戳属于哪个组)。
任何建议都会很有帮助。
最佳答案
实际上,这两种方法都很好,如果有,它们都可以在数据库中time_stamp
列的索引上受益。我会尽力为他们提供建议:
多个查询并不是一个坏主意,您的数据看起来是非常静态的,您可以在20个不同的连接中运行20个类似于select avg(value) from data where time_stamp between date_from and date_to
的查询来加速整个操作。您将消除从数据库向客户机传输大量数据的需要。缺点是需要包含一个额外的where
条件,以排除具有不需要的external_id
值的行。这会使查询复杂化,如果有很多这样的值,可能会使处理速度慢一点。
在这里,您可以在发送前通过time_stamp
索引对服务器上的数据进行排序,然后检查当前项是否来自新的数据区域(因为排序后,您将确保以后的项将来自以后的日期)。这会将内部循环减少为if
语句。不过,我不确定这是这里的瓶颈。也许你想看看结果的流式传输,而不是等待它们全部被获取。