В MySQL 8.0 вы можете фильтровать с помощью row_number()
:
select *
from (
select
t.*,
row_number() over(partition by id, docid order by major_version, minor_version) rn
from mytable t
) t
where rn = 1
В более ранних версиях вы можете фильтровать с помощью коррелированного подзапроса. Предполагая, что у вас есть первичный ключ в таблице, скажем, столбец pk
, вы можете сделать:
select t.*
from mytable t
where t.pk = (
select t1.pk
from mytable t1
where t1.id = t.id and t1.docid = t.docid
order by t1.major_version desc, t1.minor_version desc
limit 1
)
Для производительности рассмотрите индекс на (id, docid, major_version, minor_version)
.
Без уникального Столбец, который можно использовать в качестве первичного ключа, немного сложнее. Один из способов сделать это - использовать not exists
:
select t.*
from mytable t
where not exists (
select 1
from mytable t1
where
t1.id = t.id
and t1.docid = t.docid
and (
t1.major_version > t.major_version
or (t1.major_version = t.major_version and t1.minor_version > t.minor_version)
)
)