Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Các hàng nắm giữ mức tối đa theo nhóm của một cột nhất định (cách loại bỏ các bản sao ...)

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.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cách chuyển đổi danh sách được phân tách bằng dấu phẩy thành hàng trong SQL Server

  2. Tìm ngày gần nhất trong SQL Server

  3. Làm cách nào để tự động gửi lại sau khi sử dụng ID_insert?

  4. <table-value function> không phải là tên hàm tích hợp sẵn được công nhận

  5. Làm cách nào để bạn đọc cột XML trong SQL Server 2008?