我有一个MySQL数据库,存储一个长而详细的时间序列(即几次/分钟采样的多年测量)。当我将这些数据提供给客户进行显示时,我想对数据进行下采样,以便我不会向图表发送大量数据。例如,如果客户需要显示1年的数据,我不想发送该年的每个样本;我宁愿每小时发一个点。
我正在使用Flask / SQLAlchemy,显然我可以从该间隔中提取所有数据并在Flask中处理它,但我更倾向于使用SQL / SQLAlchemy来实现这一点以提高效率,所以我不必重新实施Flask-SQLAlchemy的分页。一种方法是对具有一些时间字段== 0的行的日期时间进行过滤;例如,如果我得到一年的数据,其中MM:SS == 00:00,我每小时得到一分,这正是我所需要的。这可能吗?有没有更好的方法从SQL或SQLAlchemy中的查询结果中获取每个第N行?
为清晰起见编辑: 我正在寻找一种有效的方法来返回DATETIME范围内的每个第N行。我可以非常轻松地获得范围内的每一行;它是我得到的每N次下采样。我不一定需要这个来为任意N工作;如果我能得到它就足够了,比如说每一行都有分钟== 0和秒== 0,或每一行有秒== 0等等。
答案 0 :(得分:1)
使用group by和summary函数每小时可以获得一个值,例如min()或avg():
select date_format(observation_date, "%Y %m %d %H") as obs_hour, avg(observation_value) as avg_value
from observations
group by date_format(observation_date, "%Y %m %d %H")
上述查询将使用date_format()函数按小时对观察值进行分组,并为您提供一小时内观察值的平均值。您可以使用不同的汇总函数,例如min()或max(),以便从每个组中获取适合您的采样技术的不同值。
您还可以使用以下标准获取那些在圆形时间内完全拍摄的观察结果:
select *
from observations
where minute(observation_date)=0 and second(observation_date)=0