【问题标题】:Python sqlite3 select without repeating fieldPython sqlite3选择不重复字段
【发布时间】: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()

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

【问题讨论】:

    标签: python python-3.x sqlite


    【解决方案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))
    

    【讨论】:

      猜你喜欢
      • 2019-04-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-05
      • 1970-01-01
      • 2019-09-06
      • 1970-01-01
      • 2020-02-01
      相关资源
      最近更新 更多