SQL:过滤具有最大值的行

时间:2014-07-11 23:39:23

标签: sql sqlite greatest-n-per-group

这是我的表结构:

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

2       |   1           |   4
3       |   2           |   5

我需要它只返回这些行

1       |   3           |   1
2       |   1           |   4
3       |   2           |   5

含义我只想要每个文件具有最新版本的函数。

我不希望得到以下结果,即不是最新版本的唯一函数ID

1       |   3           |   1
1       |   2           |   2
...

我查看了How can I SELECT rows with MAX(Column value), DISTINCT by another column in SQL?,但这会返回最新的唯一函数ID。

查询需要与sqlite3兼容。

3 个答案:

答案 0 :(得分:3)

执行此操作的有效方法通常是使用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
                 );

此查询可以利用table(file, version)上的索引。

这将查询重新表述为:“从相应文件没有更大版本的表中获取所有行。”

答案 1 :(得分:2)

在SQLite 3.7.11或更高版本中,当您使用MAX时,其他值保证来自具有最大值的行:

SELECT File,
       MAX(Version) AS Version,
       Function
FROM MyTable
GROUP BY File

答案 2 :(得分:1)

请注意,如果文件的整体最新版本存在于不同的功能,则每个文件将返回多行。即如果上面的示例有一行(1,3,2),则会为文件1返回2行。

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