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