目前我有一个函数可以返回整个数据集中出错率最高的股票代码。我真正想要的是返回当天最高错误的股票代码。
这是当前的功能:
@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
答案 0 :(得分:0)
错误非常自我解释。您不能在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)).\