Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在sqlalchemy中按年、月、日分组_Python_Sqlalchemy - Fatal编程技术网

Python 在sqlalchemy中按年、月、日分组

Python 在sqlalchemy中按年、月、日分组,python,sqlalchemy,Python,Sqlalchemy,我想要 但此查询无法使用 如何使用SQLAlchemy做到这一点?假设您的db引擎实际上支持像MONTH()这样的函数,您可以试试 DBSession.query(Article).group_by(Article.created.month).all() 否则,您可以使用类似python的方式进行分组 import sqlalchemy as sa DBSession.query(Article).group_by( sa.func.year(Article.created), sa.fun

我想要

但此查询无法使用


如何使用SQLAlchemy做到这一点?

假设您的db引擎实际上支持像
MONTH()
这样的函数,您可以试试

DBSession.query(Article).group_by(Article.created.month).all()
否则,您可以使用类似python的方式进行分组

import sqlalchemy as sa
DBSession.query(Article).group_by( sa.func.year(Article.created), sa.func.month(Article.created)).all()

THC4k答案有效,但我只想补充一点,
query\u结果
需要已经排序,才能以您想要的方式获得
itertools.groupby

from itertools import groupby

def grouper( item ): 
    return item.created.year, item.created.month
for ( (year, month), items ) in groupby( query_result, grouper ):
    for item in items:
        # do stuff
以下是本手册中的说明:

groupby()的操作类似于Unix中的uniq筛选器。每次键函数的值更改时,它都会生成一个中断或新组(这就是为什么通常需要使用相同的键函数对数据进行排序)。这种行为与SQL的组不同,SQL的组聚合公共元素,而不考虑它们的输入顺序


我知道这个问题由来已久,但为了让所有搜索解决方案的人受益,这里有另一个不支持MONTH()等函数的数据库策略:

本质上,这是将时间戳转换为截断的字符串,然后可以对这些字符串进行分组

如果只需要最新的条目,可以添加,例如:

db.session.query(sa.func.count(Article.id)).\
    group_by(sa.func.strftime("%Y-%m-%d", Article.created)).all()

遵循此策略,只需省略年份和月份,您就可以轻松创建诸如星期几之类的分组。

对于postgres,使用
date\u trunc
而不是
strftime
db.session.query(sa.func.count(Article.id)).\
    group_by(sa.func.strftime("%Y-%m-%d", Article.created)).all()
    order_by(Article.created.desc()).limit(7)