2017-04-07 59 views
0

我在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() 

也許實現CMPEQ在我的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() 

我要的是組

+0

您的解決方案(通常)可能會返回多個結果。除非'min()'中的值是唯一的(我猜是這樣,因爲'id'聽起來像是一個主鍵;但如果它只是一個外鍵,情況可能並非如此)。 - 這是[tag:most-n-per-group](其中N = 1)的特例。這裏有很多SQL解決方案,但我不知道哪一個最適合[SQLAlchemy](http://stackoverflow.com/questions/tagged/sqlalchemy+greatest-n-per-group) 。 – pozs

+0

對不起,我編輯標識日期和日期是唯一索引。 – Timo

+0

但這沒什麼意義,因爲'SELECT min(date)... GROUP BY date'和'SELECT date ... GROUP BY date'是相同的(日期中只有一個'date'無論如何,這個團隊)。 - 另外,單個索引不保證其唯一性。 – pozs

回答

1

你需要列出你要選擇,把他們在GROUP_BY所有列的每個組和value_avg的第一OBJ。然後,您可以選擇不屬於組的組成部分的聚合列。

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() 
+0

是的,但當你不得不用懶惰的查詢處理像obj.obj2.obj3這樣的外部對象時,這並不容易 – Timo