目前,我有一个函数可以返回整个数据集误差最大的股票报价器。我真正想要的是返回当天误差最大的股票报价器。
下面是当前的函数:
@main.route('/api/highest/error')
def get_highest_error():
"""
API which returns the highest stock error for the current day.
:return: ticker of the stock matching the query.
"""
sub = db.session.query(db.func.max(Stock.error).label('max_error')).subquery()
stock = db.session.query(Stock).join(sub, sub.c.max_error == Stock.error).first()
return stock.ticker这是我尝试过的:
todays_stock = db.session.query(db.func.date(Stock.time_stamp) == date.today())
stock = todays_stock.filter(db.func.max(Stock.error))
return stock.ticker不幸的是,这是在BaseQuery上运行的,这并不是我所期望的。
我也试过了:
stock = Stock.query.filter(db.func.date(Stock.time_stamp) == date.today()).filter(db.func.max(Stock.error)).first()但是这会产生一个错误,消息是aggregate functions are not allowed in WHERE
发布于 2018-03-26 15:31:05
错误是不言而喻的。不能在WHERE子句中使用聚合函数。如果必须根据聚合消除分组行,请使用HAVING。但这并不是您所需要的:获取错误最大的行,按错误降序排序,并选择第一行:
stock = Stock.query.\
filter(db.func.date(Stock.time_stamp) == date.today()).\
order_by(Stock.error.desc().nullslast()).\
first()除非你每天都有大量的Stock,否则排序应该足够快。请注意,db.func.date(Stock.time_stamp) == date.today()对索引不是很友好,除非您的数据库支持函数索引。相反,您可以在半开放的范围内进行过滤:
today = date.today()
...
filter(Stock.time_stamp >= today,
Stock.time_stamp < today + timedelta(days=1)).\https://stackoverflow.com/questions/49456032
复制相似问题