DECLARE @Data TABLE (ID INTEGER, X INTEGER, Y INTEGER)
INSERT @Data VALUES (1,1,1),(2,1,2),(3,1,2),(4,1,3),(5,1,3),
(6,2,4),(7,2,5),(8,2,5),(9,2,5),(10,3,1),(11,3,10),(12,3,10)
;WITH CTE AS
(
SELECT ID, X, Y,
ROW_NUMBER() OVER(PARTITION BY X ORDER BY Y DESC, ID ASC) AS RowNo
FROM @Data
)
SELECT ID, X, Y FROM CTE WHERE RowNo = 1
Używając ROW_NUMBER() aby przypisać każdemu wierszowi przyrostową liczbę, która resetuje się do 1 dla każdej nowej wartości X. W przypadku wierszy z tą samą wartością dla X, numer wiersza jest przypisywany przyrostowo według Y malejąco i ID rosnąco - więc dla określonej wartości X, wiersz o numerze 1 zostanie przypisany do tego, który ma NAJWYŻSZĄ wartość Y i NAJNIŻSZY ID. Następnie dodajemy ograniczenie, aby zwracać tylko te, w których RowNo wynosi 1.