SQL Server 2005+, przy użyciu CTE:
WITH rows AS (
SELECT t.id,
t.staff_id,
t.skill_id,
t.mainskill,
ROW_NUMBER() OVER (PARTITION BY t.staff_id ORDER BY t.mainskill DESC) AS rank
FROM TABLE t)
SELECT r.id,
r.staff_id,
r.skill_id,
r.mainskill
FROM rows r
WHERE r.rank = 1
ORDER BY r.staff_id
SQL Server 2005+, odpowiednik bez CTE:
SELECT r.id,
r.staff_id,
r.skill_id,
r.mainskill
FROM (SELECT t.id,
t.staff_id,
t.skill_id,
t.mainskill,
ROW_NUMBER() OVER (PARTITION BY t.staff_id ORDER BY t.mainskill DESC) AS rank
FROM TABLE t) r
WHERE r.rank = 1
ORDER BY r.staff_id
Oba używają ROW_NUMBER , który jest dostępny tylko od SQL Server 2005.