কীভাবে MAX সারি পাবেন


20

এসকিউএল সার্ভারে আমি সর্বদা ডেটাসেটের সর্বাধিক সারি পাওয়ার জন্য ব্যথা পেয়েছি, আমি পারফরম্যান্স এবং রক্ষণাবেক্ষণের বিষয়ে কিছু দিকনির্দেশনা সহ সর্বাধিক সারিগুলি পুনরুদ্ধার করার পদ্ধতির একটি তালিকা খুঁজছি।

নমুনা সারণী:

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

দুটি স্বাভাবিক পদ্ধতি: সমষ্টি এবং র‌্যাঙ্কিংয়ের কার্য।

সমষ্টিগত এসকিউএল সার্ভার 2000 এ কাজ করে Both উভয় উপায়েই কোনও সিটিই বা উত্পন্ন টেবিল ব্যবহার করতে পারে

পারফরম্যান্সের জন্য, আমি সামগ্রিক আরও ভাল কাজ খুঁজে পেয়েছি। তবে এটি দেখে মনে হচ্ছে এসকিউএল সার্ভার ২০০৮ র‌্যাঙ্কিংয়ের ফাংশনগুলি এসকিউএল সার্ভার ২০০ 2005-এর চেয়ে অনেক বেশি ভালভাবে চালিত হয়েছে S

এখানে দুটি প্রাসঙ্গিক এসও প্রশ্ন রয়েছে তবে আমি বর্তমানে সেগুলি খুঁজে পাচ্ছি না। একটি হ'ল র‌্যাঙ্কিং ফাংশন সহ উচ্চ যৌক্তিক আইও সম্পর্কিত একটি প্রশ্ন, অন্যটি এসকিউএল 2 কে 5 বনাম 2 কে 8-র উপরে মন্তব্যে র‌্যাঙ্কিংয়ের পরীক্ষা করছে। দুঃখিত।

--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
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.