python - 在 SQLite 或 Python 中聚合

标签 python sql sqlite aggregate

假设我有一个包含文章标题、作者和发布日期的表,我检索 7 月 1 日之后发布的所有内容, - 但现在我想迭代的不是单独的文章标题,而是通过每天发布的所有文章的集合,构建此列表的最佳且最Pythonic 的方法是什么。可以在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)

它将给出一个(天,组)的元组,并且可以按照下面描述的方式迭代。

最佳答案

SQL 查询通常只会返回一组行作为结果。

假设您已在游标 curs 中检索到所需的所有行,并假设结果行均由 (header,author, pub_date) 组成并且您在 SQL 中按照 pub_date 的升序对数据进行排序。

使用itertools.groupby()定义一个返回 pub_date 列的关键函数非常容易(我想到了 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

验证这是否如您所愿。

关于python - 在 SQLite 或 Python 中聚合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24696351/

相关文章:

python - matplotlib:更新补丁的位置(或:set_xy for circles)

python - 如何让 doxygen 忽略 Python 脚本的第一行?

mysql - 查询合并相同列名的两个表

mysql - 一个字段的值基于另一个字段的总和

sql - 给定一个用户 ID,获取他们所有的收件人 channel 和最后一条消息预览?

android - SQLite 查询仅针对特定列崩溃 - 无法读取第 0 行,第 -1 列

java - Android 开发 SQLite 与 Hashtable

python - 如何使用网格布局管理器将两个按钮排列在框架中的所需位置?

python - 使用 imap 获取电子邮件附件,但无论电子邮件是从 Outlook 客户端还是通过 Web 发送,都会得到不同的结果

android - 如何将 Shift-JIS 编码的字符串转换为 UTF-8?