我在 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 模型中实现 cmp 和 eq ? (最佳实践是什么)
编辑:
我有一个解决方法,但我不确定这是一个好的做法。第一个分组依据和下一个加入:
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/