Python sqlite3选择不重复字段

Posted

技术标签:

【中文标题】Python sqlite3选择不重复字段【英文标题】:Python sqlite3 select without repeating field 【发布时间】:2017-08-23 15:25:25 【问题描述】:

我在 python 中使用 sqlite3 数据库,我需要从一个日期获取所有数据,但我只需要每个用户的最后一行。让我解释一下自己: 我目前的代码是这样的:

conn = sqlite3.connect('database.db')
c = conn.cursor()

t = (user, pastTS)
resultPoints = c.execute("SELECT * FROM table WHERE user != ? AND timestamp >= ?", t)
conn.close()

问题在于,当我只想要最后一个时,它会从同一个用户返回多个条目/行。 是否有任何简单的方法可以实现这一点,或者我应该分析光标以删除重复字段?

【问题讨论】:

【参考方案1】:

如果我正确理解您的问题,您可以按用户分组并获取每个用户的最大时间戳值,然后加入 table 并输出结果:

c.execute("""
    SELECT *
    FROM (
          SELECT user, MAX(timestamp) as MaxTime
          FROM table
          GROUP BY user
    ) t2
    INNER JOIN table t1
    ON t1.user != ? and t1.user = t2.user AND t1.timestamp = t2.MaxTime
""", t)

result = c.fetchall()
print(result)

【讨论】:

但这只会给我一个结果,不是吗?我需要每个用户的一个结果。数据库可能是这样的,例如: User1 4419 User2 4114 User2 4112 User3 4109 我需要获取每个用户的最后一行 @Javierd98 明白了,请查看更新后的查询。 谢谢!这正是我需要的!【参考方案2】:

要为每个用户获取一个输出行,请使用分组。 要从每个组中选择要返回的行,use MAX():

c.execute("""SELECT user,
                    [other fields],
                    MAX(timestamp) AS timestamp
             FROM MyTable
             WHERE user != ?
               AND timestamp >= ?
             GROUP BY user
          """, (user, pastTS))

【讨论】:

以上是关于Python sqlite3选择不重复字段的主要内容,如果未能解决你的问题,请参考以下文章

选择禁用不插入的字段[重复]

Android - 不自动选择 EditText 字段[重复]

无法使用 sqlite3 在磁盘上保存数据库 - Python [重复]

python 字段值不重复

在python中使用sqlite3注入安全参数化查询[重复]

TypeError:“sqlite3.Cursor”对象不可下标。如何在没有for循环的情况下打印sql选择数据[重复]