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

इस FIRST_VALUE क्वेरी में क्या गलत है?

डिफ़ॉल्ट RANGE / ROWS FIRST_VALUE . के लिए (किसी भी अन्य विश्लेषणात्मक कार्य के लिए) BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW है ।

अगर आप IGNORE NULLS जोड़ते हैं , फिर NULL रेंज बनाते समय मूल्यों को ध्यान में नहीं रखा जाता है।

RANGE न्यूल पंक्तियों को छोड़कर BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW (यह मान्य नहीं है OVER खंड)।

चूंकि आपका txt वे हैं जो NULL हैं उच्च id है हैं, उन्हें पहले चुना जाता है, और उनकी श्रेणियां खाली हैं, क्योंकि कोई गैर-NULL नहीं है उनके और UNBOUNDED PRECEDING . के बीच की पंक्तियाँ

आपको या तो ORDER BY बदलना चाहिए या RANGE आपकी क्वेरी का खंड।

ORDER BY . बदल रहा है पंक्तियों को NULL . के साथ रखता है आईडी खिड़की के अंत में है ताकि एक गैर-NULL मान (यदि कोई हो) हमेशा पहले चुना जाएगा, और RANGE निश्चित रूप से उस मान से प्रारंभ होगा:

with t
as (
  select 450 id, null txt , 3488 id_usr from dual union all
  select 449   , null     , 3488        from dual union all
  select  79   , 'A'      , 3488        from dual union all
  select  78   , 'X'      , 3488        from dual 
)
select id
     , txt
     , id_usr
     , first_value(txt) over (partition by id_usr order by NVL2(TXT, NULL, id) DESC) first_one
  from t

RANGE बदल रहा है सभी गैर-NULL . को शामिल करने के लिए श्रेणी को फिर से परिभाषित करता है विभाजन में पंक्तियाँ:

with t
as (
  select 450 id, null txt , 3488 id_usr from dual union all
  select 449   , null     , 3488        from dual union all
  select  79   , 'A'      , 3488        from dual union all
  select  78   , 'X'      , 3488        from dual 
)
select id
     , txt
     , id_usr
     , first_value(txt IGNORE NULLS) over (partition by id_usr order by id DESC RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) first_one
  from t



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. ORA-01858 देखकर:एक गैर-संख्यात्मक वर्ण पाया गया जहां एक संख्यात्मक अपेक्षित था

  2. BEGIN/END और एकल .sql फ़ाइल में तालिका बनाएं

  3. ओरेकल के साथ PHP को कॉन्फ़िगर करें

  4. एक विदेशी कुंजी चेक बाधा को लागू करने के लिए ट्रिगर का उपयोग करना

  5. Oracle PL/SQL तालिका प्रकार का TO_CHAR