【问题标题】:How to get rows distinct by one field using another field to choose the one if there are many in an Sqlite table?如果 Sqlite 表中有很多行,如何使用另一个字段来选择一个字段来区分行?
【发布时间】:2017-04-25 00:48:22
【问题描述】:

让我们考虑以下存储相同记录的多个版本的 SQlite 示例表:

CREATE TABLE MyRecords(
id LONG NOT NULL,
version LONG NOT NULL,
text TEXT,
PRIMARY KEY (id ASC, version ASC)
);

如何使用version 列为每个不同的id 值仅获取一行以选择一个(如果表中保存了多个,则具有最高的version 值?

【问题讨论】:

    标签: sqlite


    【解决方案1】:

    试试这个查询:

    SELECT *
    FROM MyRecords r1
    WHERE version = (SELECT MAX(version) FROM MyRecords r2 WHERE r1.id = r2.id) 
    

    【讨论】:

      【解决方案2】:

      您可以获取每个 id 的最大版本,然后返回以获取文本值

      SELECT * 
        FROM (
          SELECT id, MAX(version) version
            FROM MyRecords
           GROUP BY id
      ) q JOIN MyRecords r
          ON q.id = r.id
         AND q.version = r.version 
      

      SQLFiddle

      【讨论】:

        【解决方案3】:

        在 SQLite 3.7.11 或更高版本中,您可以简单地use max() to select which row in a group to return

        SELECT id,
               MAX(version) AS version,
               text
        FROM MyRecords
        GROUP BY id;
        

        【讨论】:

        • 这不只是用返回的记录中已知的最大版本值替换实际的version 字段值,而不是实际返回所有真实记录,丢弃那些具有相同id 但低于@987654326 的记录@?
        • 否; GROUP BY 每个 id 返回一行,如链接中所述,text 值来自正确的行。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-09-25
        • 2013-03-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多