python - 在 postgresql/sqlalchemy 中选择 group by 的第一个对象

标签 python postgresql sqlite sqlalchemy

我在 sqlachemy 中有一个使用 SQLite 的请求,它返回分组依据的对象和一个值(avg):

result = session.query(
        obj, func.avg(obj.value).label("value_avg")
    ).group_by(
        func.strftime('%s', obj.date)
    ).all()

但是现在我需要使用postgresql,它的限制性更强(严格的SQL),我需要做同样的事情,但它需要用func.avg()或其他东西来替换query(obj)。 。所以我想知道是否存在任何可以返回每个组的第一个对象的函数。如果不可能,也许我可以为我的 obj 实现比较器,例如像这样调用 func.min(obj) :

result = session.query(
        func.min(obj), func.avg(obj.value).label("value_avg")
    ).group_by(
        func.date_part('second', obj.date)
    ).all()

也许可以在我的 obj 模型中实现 cmpeq ? (最佳实践是什么)

编辑:

我有一个解决方法,但我不确定这是一个好的做法。第一个分组依据和下一个加入:

sq = session.query(
        func.min(obj.date).label("date"), func.avg(obj.value).label("value_avg")
    ).group_by(
        func.cast(func.extract('second', obj.date) / 600, Integer)
    ).order_by(obj.date).subquery()
result = session.query(obj, sq.c.value_avg).join(sq,sq.c.date == obj.date).all()

我想要的是每个组的第一个 obj 和该组的 value_avg

最佳答案

您需要列出要选择的所有列并将它们放入 group_by 中。然后您可以选择不属于分组依据的聚合列。

result = session.query(
    obj.column1,
    obj.column2,
    obj.column3,
    func.strftime('%s', obj.date),
    func.avg(obj.value).label("value_avg")
).group_by(
    obj.column1,
    obj.column2,
    obj.column3,
    obj.date
).all()

关于python - 在 postgresql/sqlalchemy 中选择 group by 的第一个对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43271903/

相关文章:

sqlite - dense_rank 和 sqlite - 可能吗?

android - Eclipse 上是否有任何 SQLite 客户端来分析 Android 应用程序中使用的数据库?

python - 如何拥有同时满足 Windows 和 Linux 的 setup.py 文件?

python - 重写依赖提供者是否被认为是不好的做法?

python - 在 Ubuntu 中安装 mysqlclient 返回错误号 1

java - 当我将它放入数据库中与将其从数据库中取出时, new String(byte[]) 会给出不同的结果

postgresql - 我如何从 postgresql 中的两个日期之间获取 recored week wise?

python - 为什么内置函数的__self__返回它所属的内置模块?

postgresql - Postgres - 基于列值的不同聚合

java - Java SQLexecuteQuery 抛出有效 sql 语句错误