SQL Server 2005+ using 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+, non-CTE equivalent:
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
Both use ROW_NUMBER , which is only available with SQL Server 2005.
source share