可以在datetime字段的单个元素上过滤SQL行吗?

时间:2016-03-17 22:42:50

标签: mysql sql sqlalchemy flask-sqlalchemy

我有一个MySQL数据库,存储一个长而详细的时间序列(即几次/分钟采样的多年测量)。当我将这些数据提供给客户进行显示时,我想对数据进行下采样,以便我不会向图表发送大量数据。例如,如果客户需要显示1年的数据,我不想发送该年的每个样本;我宁愿每小时发一个点。

我正在使用Flask / SQLAlchemy,显然我可以从该间隔中提取所有数据并在Flask中处理它,但我更倾向于使用SQL / SQLAlchemy来实现这一点以提高效率,所以我不必重新实施Flask-SQLAlchemy的分页。一种方法是对具有一些时间字段== 0的行的日期时间进行过滤;例如,如果我得到一年的数据,其中MM:SS == 00:00,我每小时得到一分,这正是我所需要的。这可能吗?有没有更好的方法从SQL或SQLAlchemy中的查询结果中获取每个第N行?

为清晰起见编辑: 我正在寻找一种有效的方法来返回DATETIME范围内的每个第N行。我可以非常轻松地获得范围内的每一行;它是我得到的每N次下采样。我不一定需要这个来为任意N工作;如果我能得到它就足够了,比如说每一行都有分钟== 0和秒== 0,或每一行有秒== 0等等。

1 个答案:

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