SQL: Filter rows with max value

前端 未结 3 1125
一整个雨季
一整个雨季 2020-12-21 00:45

This is my table structure:

File    |   Version     |   Function
1       |   1           |   1
1       |   2           |   1
1       |   3           |   1
1          


        
相关标签:
3条回答
  • 2020-12-21 01:37

    An efficient way to do this is often to use not exists:

    select t.*
    from table t
    where not exists (select 1
                      from table t2
                      where t2.file = t.file and t2.Version > t.version
                     );
    

    This query can take advantage of an index on table(file, version).

    This rephrases the query to be: "Get me all rows from the table where the corresponding file has no larger version."

    0 讨论(0)
  • 2020-12-21 01:39

    Note that this will return multiple rows per file if the overall latest version for a file exists for different functions. i.e. if your example above had an additional row (1,3,2) this would return 2 rows for file 1.

    select
        t1.file,
        t1.version,
        t1.function
    from 
        mytable t1
    join (
        select 
            t2.file,
            max(t2.version) max_version        
        from  mytable t2
        group by t2.file
    ) t3 join t1.file = t3.file and t1.version = t3.max_version
    
    0 讨论(0)
  • 2020-12-21 01:42

    In SQLite 3.7.11 or later, when you use MAX, the other values are guaranteed to come from the row with the largest value:

    SELECT File,
           MAX(Version) AS Version,
           Function
    FROM MyTable
    GROUP BY File
    
    0 讨论(0)
提交回复
热议问题