gpt4 book ai didi

python - 在 postgresql/sqlalchemy 中选择分组依据的第一个对象

转载 作者:行者123 更新时间:2023-11-29 12:55:58 25 4
gpt4 key购买 nike

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

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

但是现在我需要使用限制性更强的 postgresql(严格的 SQL)并且我需要做同样的事情但是它需要用 func.avg() 之类的组中的某些东西替换查询(obj)或其他东西.所以我想知道是否存在任何可以返回每个组的第一个 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 中选择分组依据的第一个对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43271903/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com