flask sqlachemy 查询 先分组再排序

264 阅读1分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。 需求:根据交易币对,回测时间提取出年化收益率最高的出来,放到最优策略参数那里,如下图 在这里插入图片描述 效果如下图: 在这里插入图片描述 我心想,这还不简单,先来个group_by 交易币对,回测时间,再来个order_by 年化收益率,分分钟搞出来,事实证明,我有点年轻,先看这样写的效果

best_param = db.session.query(BottomBacktestStrategy).group_by(BottomBacktestStrategy.symbol,
                                                                   BottomBacktestStrategy.start_time,
                                                                   BottomBacktestStrategy.end_time).order_by(
        BottomBacktestStrategy.total_earn_pecent).all()

如上图,查出来的是id为4466与4595的2个,然后去数据库一看, 在这里插入图片描述

在这里插入图片描述 嗯。。分组是分组了,但都是取分组后的第一个,并没有取年化率最高的那个,后面经过n多次的尝试,只要分组,一定是取分组后的第一个。然后经过多次的尝试,最终用子查询搞定,代码如下:

from sqlalchemy import func
subq = db.session.query(func.max(BottomBacktestStrategy.total_earn_pecent).label('max_pecent'),
                                    BottomBacktestStrategy.symbol.label('symbol'),
                                    BottomBacktestStrategy.start_time.label('start_time'),
                                    BottomBacktestStrategy.end_time.label('end_time')).group_by(
                BottomBacktestStrategy.symbol, BottomBacktestStrategy.start_time,
                BottomBacktestStrategy.end_time).subquery()
                
pagination = db.session.query(BottomBacktestStrategy).filter(
                BottomBacktestStrategy.total_earn_pecent == subq.c.max_pecent,
                BottomBacktestStrategy.symbol == subq.c.symbol, BottomBacktestStrategy.start_time == subq.c.start_time,
                BottomBacktestStrategy.end_time == subq.c.end_time).paginate(page, num, False)

label是起别名,subquery()是作为子查询, 在父查询中,如果想要使用子查询的字段,那么可以通过子查询的返回值上的c属性拿到。 最后的.paginate(page, num, False)是flask的分页的用法,page是第几页(比如1),num是每页几条数据(比如10),False是查不到不报错 感悟: 遇到问题多想办法,总会有解决方案的

最后特别感谢:www.cnblogs.com/chen0427/p/…