我在sqlachemy使用SQLite的請求,其通過返回該組的一個對象和一個值(平均):通過PostgreSQL中/ SQLAlchemy的選擇組的第一個目的
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的func。如果沒有可能,也許我能爲我的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()
也許實現CMP和EQ在我的OBJ模型? (什麼是最好的做法)
編輯:
我有一個解決方法,但我不知道這是一個很好的做法。通過第一組和下一個加盟:
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()
我要的是組
您的解決方案(通常)可能會返回多個結果。除非'min()'中的值是唯一的(我猜是這樣,因爲'id'聽起來像是一個主鍵;但如果它只是一個外鍵,情況可能並非如此)。 - 這是[tag:most-n-per-group](其中N = 1)的特例。這裏有很多SQL解決方案,但我不知道哪一個最適合[SQLAlchemy](http://stackoverflow.com/questions/tagged/sqlalchemy+greatest-n-per-group) 。 – pozs
對不起,我編輯標識日期和日期是唯一索引。 – Timo
但這沒什麼意義,因爲'SELECT min(date)... GROUP BY date'和'SELECT date ... GROUP BY date'是相同的(日期中只有一個'date'無論如何,這個團隊)。 - 另外,單個索引不保證其唯一性。 – pozs