SQLite或Python中的聚合

1 投票
1 回答
636 浏览
提问于 2025-04-18 12:56

假设我有一个表格,里面有文章的标题、作者和发布日期。我想找出所有在7月1日之后发布的文章,但现在我想要的不是单独查看每篇文章的标题,而是按每天发布的文章进行分组。请问用什么方法最简单、最符合Python的风格来生成这个列表?这个操作能在sqlite查询中完成吗?

补充说明:其实我并没有在sqlite3中创建文章的表格,但假设我有一个。假设这个表格叫做 articles,它的结构是这样的:

title TEXT, author TEXT, publisher TEXT, date DATETIME

可以这样获取文章:

cursor.execute("SELECT * FROM articles where date > ?", \ 
(datetime.datetime(2014, 07, 01),))

然后可以按照下面的方式进行分组(参考Holdenweb的回答):

itertools.groupby(cursor.fetchall(), lambda x: datetime.strptime(x[3], '%Y-%m-%d %H:%M:%S.%f').day)

这样会得到一个包含(日期,组)的元组,可以按照下面描述的方式进行遍历。

1 个回答

1

通常情况下,SQL查询只会返回一组结果行。

假设你已经在一个游标 curs 中获取了所有你想要的行,并且这些行的内容包括 (header, author, pub_date),而且你已经按照出版日期 pub_date 的升序对数据进行了排序。

使用 itertools.groupby(),你可以很简单地定义一个关键函数来返回出版日期这一列(比如可以用 lambda r: r[2])。然后,你可以遍历 groupby() 的结果,这个结果是一个包含 (key_value, group) 元组的系列,其中 key_valuepub_date 列中连续的唯一值,而 group 是一个迭代器,它会依次返回与这个关键值相关的行。你可以尝试以下代码

for key_val, group in itertools.groupby(curs.fetchall(), lambda r: r[2]):
    print key_val
    for item in group:
        print "\t", item

来验证这个方法是否如你所愿。

撰写回答