我有一堆记录,我想要计算超过特定时间单位(小时,天,周)的平均数。因此,有一种情况是我想计算每天在给定范围内的平均记录数。更清楚的是,这只是一个数字。
我现在这样做的方式(显然不起作用,因为它没有取平均值),是以下sqlalchemy查询:
db.query(MyClass).filter(MyClass.created.between(start_date, end_date)).group_by(func.HOUR(MyClass.created)).count()
以下是SHOW CREATE TABLE yt_video
的输出:
| yt_video | CREATE TABLE `yt_video` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`version` int(11) DEFAULT NULL,
`created` datetime DEFAULT NULL,
`published_date` date DEFAULT NULL,
`yt_data` text,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 |
我真正关心的是创建的时间戳,但希望这会有所帮助。
答案 0 :(得分:1)
这是answer。
在您的情况下,使用提供的表定义:
from sqlalchemy import cast, func
from sqlalchemy.types import TIME, DATE
from sqlalchemy.sql import between
time_from = ... # get filter time maybe using datetime.time()
time_to = ... # idem
counts = session.query(func.count('*').label('count')).\
filter(between(cast(MyClass.created, TIME),
time_from,
time_to)).\
group_by(cast(MyClass.created, DATE))
avg = session.query(func.avg(counts.subquery().columns.count)).scalar()
print avg
答案 1 :(得分:0)
出于好奇,在MySQL 8及更高版本中,您可以使用窗口函数达到相同的效果:
# limit(1) should work as well instead of distinct, because we know that all rows
# contain the exact same result.
db.query(func.avg(func.count()).over()).\
filter(MyClass.created.between(start_date, end_date)).\
group_by(func.date(MyClass.created)).\
distinct().\
scalar()
之所以可行,是因为逻辑上窗口函数是在GROUP BY产生组行之后求值的。