我需要进行计算,例如按时间愤怒集合将所选数据的平均值进行计算。
示例: 存储数据的表有几个主要的列,分别是: | time_stamp | external_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”的集合中,集合的外部可以有行(不需要的external_id)。
我尝试了2种方法: 1)使用SQL查询中的平均功能对每个“时间范围”步骤执行查询(但我不喜欢-所有查询都浪费太多时间,而且执行多个查询听起来不是一个好方法)
2)我选择了所有必需的行(在一个SQL请求中),然后遍历结果。问题是我必须检查当前日期时间所属的“数据组”的每个步骤。这似乎是一种更好的方法(从SQL角度来看),但由于循环,我现在的性能还不太好。我需要弄清楚如何避免在主循环中执行循环(检查当前时间戳属于哪个组)。
任何建议都会很有帮助。
答案 0 :(得分:1)
实际上,两种方法都不错,而且如果有的话,两种方法都可以从数据库time_stamp
列的索引中受益。我将尝试为他们提供建议:
多个查询并不是一个坏主意,您的数据看起来非常静态,您可以在20个不同的连接中运行20个类似select avg(value) from data where time_stamp between date_from and date_to
的查询,以加快整体操作的速度。您还将消除从数据库向客户端传输大量数据的需求。不利的一面是,您需要包括一个附加的where
条件,以排除具有不需要的external_id
值的行。如果这些值很多,这会使查询变得复杂,并且可能会使处理速度变慢。
在这里,您可以在发送之前通过time_stamp
索引对服务器上的数据进行排序,然后仅检查当前项是否来自新的数据范围(由于排序,您将确保以后的项将来自以后的日期)。这将减少内部循环为if
语句。不过,我不确定这是这里的瓶颈。也许您想研究流式传输的结果,而不是等待所有结果都被获取。