Я бы использовал Common Table Expressions (CTE). Это предлагает множество возможностей, таких как:
WITH Result (RowNumber, [id], [pid], [vid])
AS
(
SELECT Row_Number() OVER (PARTITION BY [id]
ORDER BY [vid] DESC)
,[id]
,[pid]
,[vid]
FROM MyTable
)
SELECT [id]
,[pid]
,[vid]
FROM Result
WHERE RowNumber = 1