मैंने खुद इससे कई बार संघर्ष किया है और इसका समाधान यह है कि आप अपनी क्वेरी के बारे में अलग तरह से सोचें।
मैं प्रत्येक DocGroupViewID पंक्ति चाहता हूं जहां Del_Index उस DocGroupViewID के साथ सभी पंक्तियों के लिए उच्चतम (अधिकतम) है:
SELECT
T.DocGroupViewID,
T.Del_Index,
T.ID
FROM MyTable T
WHERE T.Del_Index = (
SELECT MAX( T1.Del_Index ) FROM MyTable T1
WHERE T1.DocGroupViewID = T.DocGroupViewID
)
यह तब और जटिल हो जाता है जब एक से अधिक पंक्तियों में समान Del_Index
हो सकता है , तब से आपको यह चुनने का कोई तरीका चाहिए कि किसे दिखाना है।
संपादित करें:किसी अन्य विकल्प के साथ अनुवर्ती कार्रवाई करना चाहता था
आप RANK()
. का उपयोग कर सकते हैं या ROW_NUMBER()
परिणामों पर अधिक नियंत्रण पाने के लिए सीटीई के साथ कार्य करता है, जो निम्नानुसार है:
-- fake a source table
DECLARE @t TABLE (
ID int IDENTITY(1,1) PRIMARY KEY,
Del_Index int,
DocGroupViewID int
)
INSERT INTO @t
SELECT 1, 1 UNION ALL
SELECT 2, 1 UNION ALL
SELECT 3, 1 UNION ALL
SELECT 1, 2 UNION ALL
SELECT 2, 2 UNION ALL
SELECT 2, 2 UNION ALL
SELECT 1, 3 UNION ALL
SELECT 2, 3 UNION ALL
SELECT 3, 3 UNION ALL
SELECT 4, 3
-- show our source
SELECT * FROM @t
-- select using RANK (can have duplicates)
;WITH cteRank AS
(
SELECT
DocGroupViewID,
Del_Index,
ID,
RANK() OVER
(PARTITION BY DocGroupViewID ORDER BY Del_Index DESC)
AS RowRank,
ROW_NUMBER() OVER
(PARTITION BY DocGroupViewID ORDER BY Del_Index DESC)
AS RowNumber
FROM @t
)
SELECT *
FROM cteRank
WHERE RowRank = 1
-- select using ROW_NUMBER
;WITH cteRowNumber AS
(
SELECT
DocGroupViewID,
Del_Index,
ID,
RANK() OVER
(PARTITION BY DocGroupViewID ORDER BY Del_Index DESC)
AS RowRank,
ROW_NUMBER() OVER
(PARTITION BY DocGroupViewID ORDER BY Del_Index DESC)
AS RowNumber
FROM @t
)
SELECT *
FROM cteRowNumber
WHERE RowNumber = 1
यदि आपके पास संबंधों को सुलझाने के तरीके हैं, तो बस इसे ORDER BY
में जोड़ें ।