MAX पंक्ति कैसे प्राप्त करें


20

SQL सर्वर में मैंने हमेशा एक डाटासेट के लिए अधिकतम पंक्तियों को प्राप्त करने के लिए एक दर्द पाया है, मैं प्रदर्शन और रखरखाव पर कुछ मार्गदर्शन के साथ अधिकतम पंक्तियों को पुनः प्राप्त करने के तरीकों की एक सूची की तलाश कर रहा हूं।

नमूना तालिका:

DECLARE @Test TABLE (ID INT IDENTITY(1,1), name VARCHAR(50), 
                     dateOfBirth DATETIME, TaxNumber varchar(10))

INSERT INTO @Test (name, dateOfBirth, TaxNumber)
SELECT 'Fred', convert(datetime, '25/01/1976', 103), '123' UNION ALL
SELECT 'Bob', convert(datetime, '03/03/1976', 103), '234'  UNION ALL
SELECT 'Jane', convert(datetime, '13/06/1996', 103), '345' UNION ALL
SELECT 'Fred', convert(datetime, '14/02/1982', 103), '456' UNION ALL
SELECT 'Bob', convert(datetime, '25/10/1983', 103), '567' UNION ALL
SELECT 'Jane', convert(datetime, '12/04/1995', 103), '678' UNION ALL
SELECT 'Fred', convert(datetime, '03/03/1976', 103), '789'

select * from @Test

देता है:

ID          name      dateOfBirth             TaxNumber
----------- --------- ----------------------- ----------
1           Fred      1976-01-25 00:00:00.000 123
2           Bob       1976-03-03 00:00:00.000 234
3           Jane      1996-06-13 00:00:00.000 345
4           Fred      1982-02-14 00:00:00.000 456
5           Bob       1983-10-25 00:00:00.000 567
6           Jane      1995-04-12 00:00:00.000 678
7           Fred      1976-03-03 00:00:00.000 789

यदि मैं पूर्ण विवरण के सबसे पुराने व्यक्ति (नाम से समूह) को पुनः प्राप्त करना चाहता हूं, तो मैं किन विधियों का उपयोग कर सकता हूं?

वांछित उत्पादन:

ID          name      dateOfBirth             TaxNumber
----------- --------- ----------------------- ----------
1           Fred      1976-01-25 00:00:00.000 123
2           Bob       1976-03-03 00:00:00.000 234
6           Jane      1995-04-12 00:00:00.000 678

जवाबों:


20

दो सामान्य तरीके: कुल और रैंकिंग समारोह।

कुल SQL Server 2000 पर काम करता है। दोनों तरीके CTE या व्युत्पन्न तालिका का उपयोग कर सकते हैं

प्रदर्शन के लिए, मैंने पाया है कि कुल मिलाकर बेहतर काम करता है। हालाँकि, ऐसा लगता है कि SQL Server 2008 रैंकिंग फ़ंक्शंस SQL ​​Server 2005 की तुलना में कहीं अधिक बेहतर तरीके से चलते हैं। मैं SQL Server 2008 का दिन-प्रतिदिन अभी तक उपयोग नहीं कर रहा हूं (बड़े दिनसौर कॉर्पोरेट) तो टिप्पणी नहीं कर सकता।

2 प्रासंगिक एसओ प्रश्न हैं, लेकिन मैं उन्हें वर्तमान में नहीं ढूंढ सकता। एक रैंकिंग कार्यों के साथ उच्च तार्किक IO के बारे में एक प्रश्न है, दूसरा SQL 2k5 बनाम 2k8 पर टिप्पणियों में रैंकिंग का परीक्षण कर रहा है। माफ़ करना।

--aggregate + CTE
;WITH cOldest AS
(
    SELECT name, MIN(dateOfBirth) AS MinDOB FROM @Test GROUP BY name
)
SELECT
    T.*
FROM
    @Test T
    JOIN
    cOldest C ON T.name = C.name AND T.dateOfBirth = C.MinDOB
ORDER BY
    T.ID

--aggregate + derived table
SELECT
    T.*
FROM
    @Test T
    JOIN
    (
    SELECT name, MIN(dateOfBirth) AS MinDOB FROM @Test GROUP BY name
    ) C ON T.name = C.name AND T.dateOfBirth = C.MinDOB
ORDER BY
    T.ID

--ranking + CTE
;WITH cOldest AS
(
    SELECT *, ROW_NUMBER() OVER (PARTITION BY name ORDER BY dateOfBirth) AS rnDOB FROM @Test
)
SELECT
    C.*
FROM
    cOldest C
WHERE
    C.rnDOB = 1
ORDER BY
    C.ID

--ranking + derived table
SELECT
    C.*
FROM
    (SELECT *, ROW_NUMBER() OVER (PARTITION BY name ORDER BY dateOfBirth) AS rnDOB FROM @Test) C
WHERE
    C.rnDOB = 1
ORDER BY
    C.ID
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.