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कोड के लिए MSDN पेज पर है। कोड>
. इसलिए, एक बार जब पंक्ति विंडो को क्वेरी में स्पष्ट रूप से निर्दिष्ट किया जाता है तो यह वही लौटाता है जिसकी आवश्यकता होती है।
यदि आप उस क्रम को जानना चाहते हैं जिसमें तालिका में पंक्तियों को सम्मिलित किया गया था, तो मुझे लगता है, सबसे आसान तरीका पहचान
. तो, आपकी तालिका की परिभाषा इसमें बदल जाएगी:
CREATE TABLE Data
(PK INT IDENTITY(1,1) PRIMARY KEY,
Id1 INT,
Id2 INT)
जब आप INSERT
इस तालिका में आपको PK
. के लिए मान निर्दिष्ट करने की आवश्यकता नहीं है , सर्वर इसे स्वचालित रूप से उत्पन्न करेगा। यह गारंटी देता है कि उत्पन्न मान अद्वितीय और बढ़ते हैं (सकारात्मक वृद्धि पैरामीटर के साथ), भले ही आपके पास एक ही समय में एक ही समय में कई क्लाइंट सम्मिलित हों। जेनरेट किए गए मानों के बीच अंतराल हो सकता है, लेकिन जेनरेट किए गए मानों का सापेक्ष क्रम आपको बताएगा कि किस पंक्ति के बाद कौन सी पंक्ति डाली गई थी।