व्यवहार को स्पष्ट करने के लिए यहां एक त्वरित प्रश्न दिया गया है:
select
v,
-- FIRST_VALUE() and LAST_VALUE()
first_value(v) over(order by v) f1,
first_value(v) over(order by v rows between unbounded preceding and current row) f2,
first_value(v) over(order by v rows between unbounded preceding and unbounded following) f3,
last_value (v) over(order by v) l1,
last_value (v) over(order by v rows between unbounded preceding and current row) l2,
last_value (v) over(order by v rows between unbounded preceding and unbounded following) l3,
-- For completeness' sake, let's also compare the above with MAX()
max (v) over() m1,
max (v) over(order by v) m2,
max (v) over(order by v rows between unbounded preceding and current row) m3,
max (v) over(order by v rows between unbounded preceding and unbounded following) m4
from (values(1),(2),(3),(4)) t(v)
उपरोक्त क्वेरी का आउटपुट यहां देखा जा सकता है (SQLFiddle यहां ):
| V | F1 | F2 | F3 | L1 | L2 | L3 | M1 | M2 | M3 | M4 |
|---|----|----|----|----|----|----|----|----|----|----|
| 1 | 1 | 1 | 1 | 1 | 1 | 4 | 4 | 1 | 1 | 4 |
| 2 | 1 | 1 | 1 | 2 | 2 | 4 | 4 | 2 | 2 | 4 |
| 3 | 1 | 1 | 1 | 3 | 3 | 4 | 4 | 3 | 3 | 4 |
| 4 | 1 | 1 | 1 | 4 | 4 | 4 | 4 | 4 | 4 | 4 |
कुछ लोग उन अंतर्निहित फ़्रेमों के बारे में सोचते हैं जो विंडो फ़ंक्शंस पर लागू होते हैं जो ORDER BY
. लेते हैं खंड। इस मामले में, विंडोज़ डिफ़ॉल्ट रूप से फ्रेम में हैं RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
. (RANGE बिल्कुल ROWS के समान नहीं है, लेकिन यह एक और कहानी है)। इसके बारे में इस तरह से सोचें:
- पंक्ति में
v = 1
. के साथ ऑर्डर की गई विंडो का फ्रेमv IN (1)
. तक फैला हुआ है - पंक्ति में
v = 2
. के साथ ऑर्डर की गई विंडो का फ्रेमv IN (1, 2)
. तक फैला हुआ है - पंक्ति में
v = 3
. के साथ ऑर्डर की गई विंडो का फ्रेमv IN (1, 2, 3)
. तक फैला हुआ है - पंक्ति में
v = 4
. के साथ ऑर्डर की गई विंडो का फ्रेमv IN (1, 2, 3, 4)
. तक फैला हुआ है
यदि आप उस व्यवहार को रोकना चाहते हैं, तो आपके पास दो विकल्प हैं:
- एक स्पष्ट
ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING
आदेशित . के लिए खंड विंडो फ़ंक्शन - कोई
ORDER BY
का प्रयोग न करें उन विंडो फ़ंक्शंस में क्लॉज़ जो उन्हें छोड़ने की अनुमति देते हैं (जैसा किMAX(v) OVER()
)
अधिक विवरण यह लेख LEAD()
. के बारे में है , LAG()
, FIRST_VALUE()
और LAST_VALUE()