2012-06-30 135 views
3

該任務是將日期時間值(使用SQLAlchemy)分組到每分鐘點(按分鐘)。SQLAlchemy group by minute

我有一個自定義的SQL查詢:

SELECT COUNT(*) AS point_value, MAX(time) as time 
    FROM `Downloads` 
    LEFT JOIN Mirror ON Downloads.mirror = Mirror.id 
WHERE Mirror.domain_name = 'localhost.local' 
    AND `time` BETWEEN '2012-06-30 00:29:00' AND '2012-07-01 00:29:00' 
GROUP BY DAYOFYEAR(time) , (60 * HOUR(time) + MINUTE(time)) 
ORDER BY time ASC 

它的偉大工程,但現在我有做在SQLAlchemy的。這是我有現在(按年份分組只是一個例子):

rows = (DBSession.query(func.count(Download.id), func.max(Download.time)). 
    filter(Download.time >= fromInterval). 
    filter(Download.time <= untilInterval). 
    join(Mirror,Download.mirror==Mirror.id). 
    group_by(func.year(Download.time)). 
    order_by(Download.time) 
) 

它給了我這個SQL:

SELECT count("Downloads".id) AS count_1, max("Downloads".time) AS max_1 
FROM "Downloads" JOIN "Mirror" ON "Downloads".mirror = "Mirror".id 
WHERE "Downloads".time >= :time_1 AND "Downloads".time <= :time_2 
GROUP BY year("Downloads".time) 
ORDER BY "Downloads".time 

正如你所看到的,它僅缺少正確的分組:

GROUP BY DAYOFYEAR(time) , (60 * HOUR(time) + MINUTE(time)) 

請問SQLAlchemy有一些函數按分鐘分組嗎?

回答

3

您可以通過使用Functions來使用SA中的任何SQL函數,而您已經使用了該函數的YEAR部分。我想在你的情況下,你只需要添加(未測試):

from sqlalchemy.sql import func 
... 
# add another group_by to your existing query: 
rows = ... 
group_by(func.year(Download.time), 
     60 * func.HOUR(Download.time) + func.MINUTE(Download.time) 
)