Here's one way..using another table that stores the Rank.--Sample DataCREATE TABLE #TEMP(ID INT,CH VARCHAR(30))INSERT INTO #TEMP VALUES (1, 'Principal')INSERT INTO #TEMP VALUES (1, 'Teacher')INSERT INTO #TEMP VALUES (1, 'Director')INSERT INTO #TEMP VALUES (1, 'Student')INSERT INTO #TEMP VALUES (1, 'Something')INSERT INTO #TEMP VALUES (1, 'Pieon')INSERT INTO #TEMP VALUES (2, 'Student')INSERT INTO #TEMP VALUES (2, 'Something')INSERT INTO #TEMP VALUES (2, 'Pieon')INSERT INTO #TEMP VALUES (3, 'Teacher')INSERT INTO #TEMP VALUES (3, 'Pieon')INSERT INTO #TEMP VALUES (3, 'blablabla')INSERT INTO #TEMP VALUES (4, 'blablabla')--Rank TableCREATE TABLE #RANK([RANK] INT,[CH] VARCHAR(30))INSERT INTO #RANKSELECT 1,'Director'UNION ALL SELECT 2,'Principal'UNION ALL SELECT 3,'Teacher'UNION ALL SELECT 4,'Student'UNION ALL SELECT 5,'Pieon'--QuerySELECT T.ID,T.CHFROM(SELECT ROW_NUMBER() OVER (PARTITION BY A.ID ORDER BY COALESCE(B.[RANK],99)) AS SEQ,A.ID,A.CH,B.[RANK]FROM #TEMP ALEFT JOIN #RANK B ON A.[CH] = B.[CH]) TWHERE T.SEQ = 1--ResultID CH----------- ------------------------------1 Director2 Student3 Teacher4 blablabla