Se você usa SQL-Server (mínimo 2005) você pode usar um
CTE
com o ROW_NUMBER
função. Você pode usar CAST
para versão para obter a ordem correta:WITH cte
AS (SELECT id,
userid,
version,
datetime,
Row_number()
OVER (
partition BY userid
ORDER BY Cast(version AS INT) DESC) rn
FROM [dbo].[table])
SELECT id,
userid,
version,
datetime
FROM cte
WHERE rn = 1
ORDER BY userid
Demonstração
ROW_NUMBER
retorna sempre um registro mesmo se houver vários usuários com a mesma versão (principal). Se você deseja retornar todos os "registros de usuário da versão superior", você deve substituir ROW_NUMBER
com DENSE_RANK
.