首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何更改我的SQLalchemy查询以包括当天?

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

Stack Overflow用户
提问于 2018-03-24 02:14:29
回答 1查看 178关注 0票数 1

目前,我有一个函数可以返回整个数据集误差最大的股票报价器。我真正想要的是返回当天误差最大的股票报价器。

下面是当前的函数:

代码语言:javascript
运行
复制
@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

这是我尝试过的:

代码语言:javascript
运行
复制
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上运行的,这并不是我所期望的。

我也试过了:

代码语言:javascript
运行
复制
 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

EN

回答 1

Stack Overflow用户

发布于 2018-03-26 15:31:05

错误是不言而喻的。不能在WHERE子句中使用聚合函数。如果必须根据聚合消除分组行,请使用HAVING。但这并不是您所需要的:获取错误最大的行,按错误降序排序,并选择第一行:

代码语言:javascript
运行
复制
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()对索引不是很友好,除非您的数据库支持函数索引。相反,您可以在半开放的范围内进行过滤:

代码语言:javascript
运行
复制
today = date.today()

...
    filter(Stock.time_stamp >= today,
           Stock.time_stamp < today + timedelta(days=1)).\
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49456032

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档