সর্বাধিক তারিখের উপর ভিত্তি করে একাধিক সারি সহ একটি ফলাফল সেট ফেরত


16

আমার একটি শিশু টেবিল রয়েছে যা এই জাতীয় কিছু:

[শুল্কের তারিখ সারণী]

| Customer ID | Some Date  | Balance |
+-------------+------------+---------+
|           1 | 2012-04-30 |   20.00 |
|           1 | 2012-03-31 |   50.00 |
|           2 | 2012-04-30 |    0.00 |
|           2 | 2012-03-31 |   10.00 | 
|           3 | 2012-03-31 |   60.00 |
|           3 | 2012-02-29 |   10.00 |

আমি এর মতো একটি ফলাফল সেট পেতে সক্ষম হতে চাই - সর্বশেষ তারিখ সহ প্রতিটি ক্লায়েন্টের জন্য একটি রেকর্ড:

| Customer ID | Some Date  | Balance |
+-------------+------------+---------+
|           1 | 2012-04-30 |   20.00 | 
|           2 | 2012-04-30 |    0.00 |
|           3 | 2012-03-31 |   60.00 |

আমি জানি যে আমি নিম্নলিখিত এসকিউএল (এসকিউএল সার্ভার সিনট্যাক্স) সহ প্রতিটি স্বতন্ত্র "গ্রাহক আইডি" এর জন্য এটি করতে পারি:

select top 1  [Some Date], [Customer ID], [Balance]
from [Cust Date Table]
where [Customer ID] = 2
order by [Some Date] desc


| Customer ID | Some Date  | Balance |
+-------------+------------+---------+
|           2 | 2012-04-30 |    0.00 |

তবে আমি যে তিনটি রেকর্ড চাইছি তা কীভাবে পাব তা নিশ্চিত নই। আমি নিশ্চিত নই যে এটি এমন পরিস্থিতি যা উপ-কোয়েরি বা অন্য কোনও কিছুর জন্য কল করে।

দয়া করে নোট করুন যে কোনও প্রদত্ত [গ্রাহক আইডি] এর জন্য সর্বোচ্চ তারিখটি আলাদা হতে পারে, (উদাহরণস্বরূপ, গ্রাহকের 3 এর সর্বোচ্চ তারিখ 2012-03-31, অন্য রেকর্ডগুলির সর্বোচ্চ তারিখ 2012-04-30 রয়েছে) -30 আমি চেষ্টা করেছি

select [Customer ID], MAX([Some Date]) AS [Latest Date], Balance 
from [Cust Date Table] 
group by [Customer ID], Balance; 

সমস্যাটি হ'ল এটি প্রতিটি গ্রাহকের জন্য কেবল এক সারিতে ফিরে আসে না - এটি একাধিক সারি দেয়।

উত্তর:


18

আপনি কেবল চান:

SELECT
    [Customer ID],
    MAX([Some Date]) AS[Latest Date]
FROM[Cust Date TABLE]
GROUP BY
    [Customer ID];

ঠিক আছে - আপনি এটি সংশোধন করেছেন। আপনি এখন সারিগুলি অর্ডার করতে এবং শীর্ষটি চয়ন করতে চান:

WITH numbered AS (
    SELECT
        [Customer ID],
        [Some Date],
        [Balance],
        ROW_NUMBER() OVER (
            PARTITION BY
                [Customer ID]
            ORDER BY
                [Some Date] DESC
        ) AS rownum
    FROM[Cust Date TABLE]
)
SELECT
    [Customer ID],
    [Some Date],
    [Balance]
FROM numbered
WHERE
    rownum = 1;

ওহ - আপনি প্রশ্ন পরিবর্তন করেছেন?
রব ফারলে

আমার উত্তর এখনই পরিবর্তন করা হয়েছে।
রব ফারলে

এই সমাধানটির একটি সুবিধা (বা অসুবিধা, আপনার প্রয়োজনীয়তার উপর নির্ভর করে) হ'ল যদি সর্বশেষতম তারিখ একই গ্রাহকের জন্য একাধিক সারিতে হয়, তবে এটি সদৃশ ফলাফল আনবে না।
টিম

7

আমি মনে করি আপনি এরকম কিছু পরে আছেন

select c.[customer ID], [some date], balance
from [cust date table] c
inner join 
    ( select [customer ID], MAX([some date]) as maxdate
    from [cust date table]
    group by [customer ID]) c2
on c2.[customer ID] = c.[customer ID]
and c2.maxdate = c.[some date]

এটিতে সিটিই, টেবিল ভেরিয়েবল, # টেবিলের মধ্যে বিভিন্ন ধরণের পরিবর্তন রয়েছে যা আপনাকে আপনার পরিস্থিতিতে সেরা পারফরম্যান্স দেয় তা দেখার জন্য আপনি চারপাশে খেলতে পারেন।


এই উত্তরটিও সঠিক। দুর্ভাগ্যক্রমে আমার কাছে এটি উত্সাহ দেওয়ার পর্যাপ্ত প্রতিনিধি নেই এবং আমাকে একটি উত্তর চয়ন করতে হবে।
জো ডিবিএ 15
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.