这是我的表结构:
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兼容。
答案 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