SQLite或Python中的聚合
假设我有一个表格,里面有文章的标题、作者和发布日期。我想找出所有在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_value
是 pub_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
来验证这个方法是否如你所愿。