अधिकतम तिथि के आधार पर कई पंक्तियों के साथ सेट किया गया परिणाम लौटना


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 |

मुझे पता है कि मैं निम्न SQL (SQL सर्वर सिंटैक्स) के साथ प्रत्येक व्यक्ति "ग्राहक आईडी" के लिए ऐसा कर सकता हूं:

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 की अधिकतम तिथि है)। मैंने कोशिश की है

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]

इस पर कई प्रकार की विविधताएँ हैं, जैसे कि CTE, टेबल वैरिएबल, #table, जो कि आप अपनी स्थिति में सबसे अच्छा प्रदर्शन देता है यह देखने के लिए साथ खेल सकते हैं।


यह उत्तर भी सही है। दुर्भाग्य से मेरे पास इसे उखाड़ने के लिए पर्याप्त प्रतिनिधि नहीं है और मुझे एक उत्तर चुनना है।
जो डीबीए
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.