如何更改我的SQLalchemy查询以包含当天?

时间:2018-03-23 18:14:29

标签: python sqlalchemy flask-sqlalchemy

目前我有一个函数可以返回整个数据集中出错率最高的股票代码。我真正想要的是返回当天最高错误的股票代码。

这是当前的功能:

@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

中生成错误

1 个答案:

答案 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)).\