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
Vì vậy, sử dụng ROW_NUMBER () để gán cho mỗi hàng một số gia tăng được đặt lại thành 1 cho mỗi giá trị X mới. Đối với các hàng có cùng giá trị cho X, số hàng được gán theo thứ tự tăng dần theo Y DESCENDING và ID ASCENDING - vì vậy đối với một giá trị X cụ thể, số hàng 1 sẽ được gán cho hàng có giá trị Y CAO NHẤT và giá trị ID THẤP NHẤT. Sau đó, chúng tôi thêm một hạn chế là chỉ trả lại những người có RowNo là 1.