Sqlserver
 sql >> डेटाबेस >  >> RDS >> Sqlserver

मैं अधिकतम (तारीख) के साथ रिकॉर्ड कैसे प्राप्त करूं और फिर परिणाम प्राप्त करने के लिए मूल्यों की तुलना करूं

यह एक 3 चरण की प्रक्रिया है, पहले ROW_NUMBER()

का उपयोग करके प्रत्येक खाते/मीटर संयोजन के लिए अपने रिकॉर्ड को रैंक करें
SELECT *,
      RowNumber = ROW_NUMBER() OVER(PARTITION BY AccountNumber, MeterNumber 
                                    ORDER BY EndDate DESC)
FROM Meter

आउटपुट

<वें शैली="पाठ्य-संरेखण:केंद्र;">आरंभ तिथि <वें शैली="पाठ्य-संरेखण:केंद्र;">दरकोड
AccountNumber MeterNumber समाप्ति तिथि RowNumber
0142628117 123470203 2020-04-22 9999-12-31 ETF0_APR20 1
0142628117 123470203 2019-04-10 2020-04-09 ***कस्टम*** 2
0142628117 123470205 2020-04-22 9999-12-31 ETF0_APR20 1
0142628117 123470205 2019-04-10 2020-04-09 ***कस्टम*** 2
1363445 105238304 2018-10-02 2019-08-11 ***कस्टम*** 1
1363445 105238304 2016-02-25 2016-04-22 ***कस्टम*** 2
1363445 130359929 2019-08-12 9999-12-31 ***कस्टम*** 1

<उप> नायब कुछ डेटा को बेहतर दिखाने के लिए छोटा किया गया

फिर आप प्रत्येक मीटर के लिए नवीनतम समाप्ति तिथि प्राप्त करने के लिए RowNumber =1 के लिए फ़िल्टर कर सकते हैं।

इसके बाद आपको अलग-अलग EndDate/RateCode संयोजनों की गणना करने की आवश्यकता है, आप COUNT(DISTINCT ...) का उपयोग नहीं कर सकते हैं विंडो वाले फ़ंक्शन में, हालांकि आप DENSE_RANK() . का उपयोग करके इसका अनुकरण कर सकते हैं :

SELECT *,
        CntDistinct = DENSE_RANK() OVER(PARTITION BY AccountNumber 
                                                ORDER BY EndDate, RateCode) 
                        + DENSE_RANK() OVER(PARTITION BY AccountNumber 
                                            ORDER BY EndDate DESC, RateCode DESC) - 1
FROM (  SELECT *,
                RowNumber = ROW_NUMBER() OVER(PARTITION BY AccountNumber, MeterNumber 
                                                ORDER BY EndDate DESC)
        FROM Meter AS m
    ) AS m
WHERE m.RowNumber = 1;

आउटपुट

<वें शैली="पाठ्य-संरेखण:केंद्र;">आरंभ तिथि <वें शैली="पाठ्य-संरेखण:केंद्र;">दरकोड
AccountNumber MeterNumber समाप्ति तिथि CntDistinct
0142628117 123470203 2020-04-22 9999-12-31 ETF0_APR20 1
0142628117 123470205 2020-04-22 9999-12-31 ETF0_APR20 1
1363445 130359929 2019-08-12 9999-12-31 ***कस्टम*** 2
1363445 105238304 2018-10-02 2019-08-11 ***कस्टम*** 2

<उप> नायब कुछ डेटा को बेहतर दिखाने के लिए छोटा किया गया

अंत में यह सब एक और सबक्वायरी में डालें और उस स्थान तक सीमित करें जहां EndDate/RateCode का एक से अधिक अद्वितीय संयोजन है:

SELECT AccountNumber, MeterNumber, StartDate, EndDate, RateCode
FROM (  SELECT *,
                CntDistinct = DENSE_RANK() OVER(PARTITION BY AccountNumber 
                                                    ORDER BY EndDate, RateCode) 
                                + DENSE_RANK() OVER(PARTITION BY AccountNumber 
                                                    ORDER BY EndDate DESC, RateCode DESC) - 1
            FROM (  SELECT *,
                            RowNumber = ROW_NUMBER() OVER(PARTITION BY AccountNumber, MeterNumber 
                                                        ORDER BY EndDate DESC)
                    FROM Meter AS m
                ) AS m
            WHERE m.RowNumber = 1
    ) AS m
WHERE m.CntDistinct > 1;

आउटपुट

<वें शैली="पाठ्य-संरेखण:केंद्र;">आरंभ तिथि <वें शैली="पाठ्य-संरेखण:केंद्र;">दरकोड
AccountNumber MeterNumber समाप्ति तिथि
0500000178767001363445 TCA105238304 2018-10-02 2019-08-11 ***कस्टम***
0500000178767001363445 TCA130359929 2019-08-12 9999-12-31 ***कस्टम***

डीबी पर उदाहरण<>फिडल




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. एसक्यूएल सर्वर में 'नवरचर' को 'डेटाटाइम' में कनवर्ट करते समय रूपांतरण त्रुटि

  2. SQL सर्वर में ऑडिट ट्रेल को लागू करने का सबसे अच्छा तरीका?

  3. डेटाबेस में सभी प्राथमिक कुंजी की सूची प्राप्त करें

  4. ISDATE() SQL सर्वर में उदाहरण

  5. क्या मुझे डेटाबेस कनेक्शन स्ट्रिंग में अधिकतम पूल आकार सेट करना चाहिए? अगर मैं नहीं करता तो क्या होता है?