当前位置: 首页 > 面试题库 >

sqlalchemy结合分组行的总和和计数

赵同
2023-03-14
问题内容

嗨,我正在使用flask-sqlalchemy在Flask中进行一些小预测游戏,我有一个用户模型:

class User(db.Model, UserMixin):
    id = db.Column(db.Integer, primary_key=True)
    nick = db.Column(db.String(255), unique=True)
    bets = relationship('Bet', backref=backref("user"))

和我的投注模型

class Bet(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    uid = db.Column(db.Integer, db.ForeignKey('user.id'))
    matchid = db.Column(db.Integer, db.ForeignKey('match.id'))
    points = db.Column(db.Integer)

两者都不是完整的类,但应该针对问题进行处理。用户可以收集分数以预测比赛结果,并获得不同数量的分数以预测确切的结果,获胜者或与众不同。现在,我想列出最重要的用户,在这里我必须总结自己在做的要点

toplist = db.session.query(User.nick, func.sum(Bet.points)).\
    join(User.bets).group_by(Bet.uid).order_by(func.sum(Bet.points).desc()).all()

效果很好,现在可能有两个玩家得到相同的总积分。在这种情况下,正确的预测量(奖励3分)将确定获胜者。我可以通过以下方式获得此列表

tophits = db.session.query(User.nick, func.count(Bet.points)).\
            join(User.bets).filter_by(points=3).all()

它们都可以很好地工作,但是我认为必须有一种方法可以将两个查询放在一起,并获得一个包含用户名,点和“
hitcount”的表。我以前在SQL中已经做到了,但是我对SQLAlchemy和大脑中的思想难题并不那么熟悉。如何将两个查询合而为一?


问题答案:

在查询tophits只需更换COUNT/filter_by具有同等构造SUM(CASE(..))filter使WHERE两个条款是一样的。下面的代码应该做到这一点:

total_points = func.sum(Bet.points).label("total_points")
total_hits = func.sum(case(value=Bet.points, whens={3: 1}, else_=0)).label("total_hits")
q = (session.query(
        User.nick,
        total_points,
        total_hits,
        )
    .join(User.bets)
    .group_by(User.nick)
    .order_by(total_points.desc())
    .order_by(total_hits.desc())
    )

请注意,我更改了group_by子句以使用SELECT中的列,因为某些数据库引擎可能会抱怨。但是您不需要这样做。



 类似资料:
  • 问题内容: 我想在sqlalchemy中使用“分组并计数”命令。我怎样才能做到这一点? 问题答案: 关于计数的文档说,对于查询,最好使用:

  • 我正在查找与url匹配但返回自定义对象的记录。 我有这个模型。。 我想查询该模型并匹配url,但返回如下响应: 我需要能够通过将记录的ip与过程中的变量进行比较,动态计算反应的ip是否为真。 一次尝试是 但我似乎无法集中IP并查看我的变量IP是否在该数组中。 谢谢你的帮助。我第一次问!

  • 问题内容: 我有一个看起来像这样的数据框: 如何求和并计算,以得到一个看起来像这样的新数据框? 我知道如何求和 或 计数: 但不是两者都要做! 问题答案: 尝试这个: 或者如果您不想重置索引: 要么 演示:

  • 我在ID号中包含姓名数据以及许多关联值。它看起来像这样: 我想创建名称的所有组合,不管有多少个,并将它们粘贴在一起,用逗号分隔,并在每个id中求其编号和值的总和。上述示例的预期输出为: 谢谢大家!

  • 问题内容: 我正在使用此数据框: 我想按名称然后按水果进行汇总,以获得每个名称的水果总数。 我尝试按名称和水果分组,但如何获取水果总数。 问题答案: 使用方法

  • 我正在使用此数据框: 我想通过名称和水果将其聚合,得到每个名称的水果总数。 我试着按名字和水果分组,但如何得到水果的总数呢。

  • 我是Elasticsearch的新手,我希望在Elasticsearch 5的字段上执行某些聚合。x索引。我有一个索引,其中包含带有字段(具有嵌套结构)和字段(具有嵌套结构)的文档。这些是动态映射的字段。以下是示例文档 文件2: DOC 3: 我想在langs字段上执行总和聚合,这样对于每个键(X/Y)和每种语言,我都可以获得索引中所有文档的总和。此外,我还想从docLang字段生成每种语言类型的

  • 问题内容: 我来自拥有LINQ的.NET世界,因此我可以像在SQL中通常看到的那样进行内存中查询。 我要对该结构进行切片,希望将其按8个字段分组,然后对另一个整数字段求和。就像是: 我以为: 创建一个Equal函数,以比较结构(那八个字 段)。遍历我正在分析的集合。对于每个项目, 检查它是否已经在哈希表中。如果存在=>我对字段求和。如果不是=>我将新项目添加到哈希表。 有没有更好的方法或任何美观,