2014-08-28 19 views
6

SQL सर्वर 2008 R2 के लिए लगातार पंक्तियों में मानों के बीच अंतर।अद्वितीय आईडी के

मुझे एक सामान्य, अद्वितीय आईडी के आधार पर लगातार पंक्तियों के बीच अंतर खोजने की आवश्यकता है।

Data: 

AccountNumber ValueDate  CustomerName  Amount   Difference 

    1   06/01/2014 Customer Name 1 -3436.184178  
    2   06/03/2014 Customer Name 2 -154.5    -51.5 
    2   06/15/2014 Customer Name 2 -103  
    3   06/02/2014 Customer Name 3 -45289.44 
    4   06/20/2014 Customer Name 4 -4907.52    -1116.43 
    4   06/25/2014 Customer Name 4 -3791.09    -3791.09 
    4   06/30/2014 Customer Name 4 -3302.19  

अंतर स्तंभ है जो मैं उत्पन्न करने के लिए कोशिश कर रहा हूँ है। मुझे केवल लगातार पंक्तियों के बीच अंतर खोजने की आवश्यकता है IF:

किसी विशेष खाता संख्या के लिए 1 से अधिक पंक्तियां हैं। एक - [पंक्ति + 1 पंक्ति] मैंने देखा


मैं/AccountNumber [इस मामले में पंक्तियों 1 और 4] 1 मूल्य के साथ पंक्तियों को दूर करने में कामयाब रहे

मैं अभी भी से अंतर खोजने की जरूरत है स्टैक ओवरफ़्लो पर कुछ जवाब हैं लेकिन वे इस परिदृश्य पर लागू नहीं होते हैं।

+1

आपको "लगातार पंक्तियों" का अर्थ निर्धारित करने की आवश्यकता है। एसक्यूएल सर्वर कैसे जानता है कि -154.5 -103 से पहले आया था? (साथ ही, खाता संख्या एक अद्वितीय नहीं है यदि उसके पास दो पंक्तियों में समान मूल्य हो।) –

+2

टेबल्स अनॉर्डर्ड सेट का प्रतिनिधित्व करते हैं। इसलिए, "लगातार पंक्ति" जैसी कोई चीज़ नहीं है जब तक कि आपके पास ऑर्डरिंग के साथ स्पष्ट रूप से कॉलम न हो - आमतौर पर एक आईडी या निर्माण तिथि। आपके डेटा में ऐसा कोई स्तंभ नहीं है, इसलिए इसकी कोई "लगातार पंक्ति" नहीं है। –

+0

निरंतरता के लिए संदर्भ बिंदु के रूप में ValueDate को शामिल करने के लिए संपादित किया गया [सुनिश्चित नहीं है कि यह एक शब्द है] – GVashist

उत्तर

7

आप ROW_NUMBER() समारोह के साथ ऐसा कर सकते हैं:

;with cte AS (SELECT *,ROW_NUMBER() OVER(PARTITION BY AccountNumber ORDER BY ValueDate) AS RN 
       FROM YourTable) 
SELECT a.*,a.Amount - b.Amount AS Diff 
FROM cte a 
LEFT JOIN cte b 
    ON a.AccountNumber = b.AccountNumber 
    AND a.RN = b.RN -1 

ROW_NUMBER() समारोह प्रत्येक पंक्ति के एक नंबर प्रदान करती। PARTITION BY वैकल्पिक है, लेकिन समूह में प्रत्येक मान के लिए संख्याकरण शुरू करने के लिए उपयोग किया जाता है, यानी: यदि आप PARTITION BY AccountNumber प्रत्येक अद्वितीय AccountNumber मान के लिए मानना ​​1 से शुरू हो जाएगा। ORDER BY बेशक यह निर्धारित करने के लिए उपयोग किया जाता है कि संख्या को कैसे जाना चाहिए, और ROW_NUMBER() फ़ंक्शन में आवश्यक है।

एक सीटीई में प्रयुक्त होता है तो आप ROW_NUMBER() का उपयोग करके 1 रिकॉर्ड से जुड़ने के लिए स्वयं-जुड़ सकते हैं, पंक्तियों के बीच तुलना की अनुमति देता है।

SQL सर्वर 2012 में LEAD() और LAG() फ़ंक्शंस सरल क्रॉस-पंक्ति तुलना के लिए अनुमति देते हैं।

+0

बिल्कुल सही। मैंने बदल दिया ??? जैसा कि हारून और गॉर्डन द्वारा सुझाए गए वैल्यूडेट के साथ है और मेरे पास आवश्यक डेटा है। – GVashist

+0

+1 जो आपने किया है उसे समझाने के लिए और इसे क्यों काम करना चाहिए। – GVashist

संबंधित मुद्दे