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

Chọn hàng đầu tiên cho mỗi nhóm

SELECT  a, b, c
FROM    (
        SELECT  *, ROW_NUMBER() OVER (PARTITION BY a ORDER BY b, c) rn
        FROM    mytable
        ) q
WHERE   rn = 1
ORDER BY
        a

hoặc

SELECT  mi.*
FROM    (
        SELECT  DISTINCT  a
        FROM    mytable
        ) md
CROSS APPLY
        (
        SELECT  TOP 1 *
        FROM    mytable mi
        WHERE   mi.a = md.a
        ORDER BY
                b, c
        ) mi
ORDER BY
        a

Tạo chỉ mục tổng hợp trên (a, b, c) để các truy vấn hoạt động nhanh hơn.

Cái nào hiệu quả hơn tùy thuộc vào việc phân phối dữ liệu của bạn.

Nếu bạn có một vài giá trị riêng biệt của a nhưng rất nhiều bản ghi trong mỗi a , truy vấn thứ hai sẽ tốt hơn.

Bạn có thể cải thiện nó nhiều hơn nữa bằng cách tạo một chế độ xem được lập chỉ mục:

CREATE VIEW v_mytable_da
WITH   SCHEMABINDING
AS
       SELECT  a, COUNT_BIG(*) cnt
       FROM    dbo.mytable
       GROUP BY
               a

GO

CREATE UNIQUE CLUSTERED INDEX
       pk_vmytableda_a
ON     v_mytable_da (a)

GO

SELECT  mi.*
FROM    v_mytable_da md
CROSS APPLY
        (
        SELECT  TOP 1 *
        FROM    mytable mi
        WHERE   mi.a = md.a
        ORDER BY
                b, c
        ) mi
ORDER BY
        a


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Hàm trong SQL Server 2008 tương tự như hàm GREATEST trong mysql?

  2. Sử dụng OBJECT_NAME () để lấy tên đối tượng từ object_id của nó trong SQL Server

  3. Làm cách nào để nhận giá trị tiếp theo của chuỗi SQL Server trong Entity Framework?

  4. Nhà cung cấp Microsoft OLE DB cho SQL Server có hỗ trợ TLS 1.2 không

  5. Các phương pháp hay nhất để sử dụng GUID làm khóa chính, cụ thể là về hiệu suất là gì?