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
या
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
(a, b, c)
. पर एक कंपोजिट इंडेक्स बनाएं प्रश्नों के तेजी से काम करने के लिए।
कौन सा अधिक कुशल है यह आपके डेटा वितरण पर निर्भर करता है।
यदि आपके पास a
. के कुछ विशिष्ट मान हैं लेकिन प्रत्येक a
. में ढेर सारे रिकॉर्ड , दूसरी क्वेरी बेहतर होगी।
अनुक्रमित दृश्य बनाकर आप इसे और भी बेहतर बना सकते हैं:
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