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

एसक्यूएल:Last_Value () गलत परिणाम देता है (लेकिन First_Value () ठीक काम करता है)

व्यवहार को स्पष्ट करने के लिए यहां एक त्वरित प्रश्न दिया गया है:

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()



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. मैं TIMESTAMP कॉलम से दिनांक/समय की जानकारी कैसे प्राप्त करूं?

  2. SQL 2 भिन्न फ़िल्टर के साथ मायने रखता है

  3. दिनांक और/या समय को वर्ण स्ट्रिंग से कनवर्ट करते समय रूपांतरण विफल रहा

  4. डेटाबेस में गतिरोध क्या है?

  5. SQL क्वेरी ऑप्टिमाइज़ेशन:बेहतर प्रदर्शन के लिए सर्वोत्तम अभ्यास