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

SQL Server 2012 में LAST_VALUE अजीब परिणाम दे रहा है

SQL सर्वर उस क्रम के बारे में नहीं जानता या परवाह नहीं करता है जिसमें तालिका में पंक्तियों को सम्मिलित किया गया था। यदि आपको विशिष्ट आदेश की आवश्यकता है, तो हमेशा ORDER BY use का उपयोग करें . आपके उदाहरण में इसके द्वारा ऑर्डर करें अस्पष्ट है, जब तक कि आप PK . शामिल नहीं करते हैं आदेश द्वारा . में . इसके अलावा, LAST_VALUE यदि आप सावधान नहीं हैं तो फ़ंक्शन विषम परिणाम लौटा सकता है - नीचे देखें।

आप MAX . का उपयोग करके अपना अपेक्षित परिणाम प्राप्त कर सकते हैं या LAST_VALUE (SQLFiddle ) वे इस मामले में बराबर हैं:

SELECT
    PK, Id1, Id2
    ,MAX(PK) OVER (PARTITION BY Id1, Id2) AS MaxValue
    ,LAST_VALUE(PK) OVER (PARTITION BY Id1, Id2 ORDER BY PK rows between unbounded preceding and unbounded following) AS LastValue
FROM
    Data
ORDER BY id1, id2, PK

इस क्वेरी का परिणाम उसी क्रम में होगा जिस क्रम में पंक्तियों को मूल रूप से तालिका में डाला गया था। आप INSERT put डालने का प्रयास कर सकते हैं पहेली में अलग-अलग क्रम में बयान। यह परिणाम को प्रभावित नहीं करता है।

साथ ही, LAST_VALUE बिल्कुल वैसा व्यवहार नहीं करता जैसा आप सहज रूप से डिफ़ॉल्ट विंडो से अपेक्षा करते हैं (जब आपके पास केवल ORDER BY होता है ओवर . में खंड)। डिफ़ॉल्ट विंडो असंबद्ध पूर्ववर्ती और वर्तमान पंक्ति के बीच की पंक्तियाँ है , जबकि आपको उम्मीद थी कि यह असंबद्ध पूर्ववर्ती और असीमित अनुवर्ती के बीच की पंक्तियाँ होगी . यहाँ एक अच्छी व्याख्या . इस SO उत्तर का लिंक LAST_VALUE . इसलिए, एक बार जब पंक्ति विंडो को क्वेरी में स्पष्ट रूप से निर्दिष्ट किया जाता है तो यह वही लौटाता है जिसकी आवश्यकता होती है।

यदि आप उस क्रम को जानना चाहते हैं जिसमें तालिका में पंक्तियों को सम्मिलित किया गया था, तो मुझे लगता है, सबसे आसान तरीका पहचान . तो, आपकी तालिका की परिभाषा इसमें बदल जाएगी:

CREATE TABLE Data 
(PK INT IDENTITY(1,1) PRIMARY KEY,
Id1 INT,
Id2 INT)

जब आप INSERT इस तालिका में आपको PK . के लिए मान निर्दिष्ट करने की आवश्यकता नहीं है , सर्वर इसे स्वचालित रूप से उत्पन्न करेगा। यह गारंटी देता है कि उत्पन्न मान अद्वितीय और बढ़ते हैं (सकारात्मक वृद्धि पैरामीटर के साथ), भले ही आपके पास एक ही समय में एक ही समय में कई क्लाइंट सम्मिलित हों। जेनरेट किए गए मानों के बीच अंतराल हो सकता है, लेकिन जेनरेट किए गए मानों का सापेक्ष क्रम आपको बताएगा कि किस पंक्ति के बाद कौन सी पंक्ति डाली गई थी।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL सर्वर के लिए सीधे संग्रहण स्थान का परिचय

  2. SQL कैश निर्भरता के लिए प्रदर्शन प्रश्न

  3. DATETIMEOFFSETFROMPARTS() SQL सर्वर में उदाहरण (T-SQL)

  4. एसएसआईएस एपीआई:कोई कैसे जानता है कि किस इंटरफ़ेस को __COMObject डालना है?

  5. कृपया SQL सर्वर आँकड़ों को बेहतर बनाने में मदद करें!