2014-09-05 5 views
5

का उपयोग कर रैंक() में एक चलती विंडो कैसे जोड़ूं, मुझे एक चलती समय विंडो पर मान रैंक करने की आवश्यकता है। मुझे https://tonyhasler.wordpress.com/2012/10/24/model-clause-use-cases/#comment-5116 पर टोनी हैस्लर द्वारा ब्लॉगपोस्ट से कुछ दिशा मिली लेकिन मध्यस्थ जैसे गैर-खिड़की वाले कार्यों में विंडोिंग क्लॉज जोड़ने का समाधान रैंक() या प्रतिशत_rank() फ़ंक्शंस के साथ काम नहीं करता है जो विश्लेषणात्मक गैर-विंडोिंग फ़ंक्शंस हैं। मंझला() फ़ंक्शन के साथमैं ओरेकल एसक्यूएल

कार्य उदाहरण:

with a as (
    select 'a' sector, trunc(sysdate) dt, 64 v from dual union all 
    select 'a' sector, trunc(sysdate)-1 dt, 2 from dual union all 
    select 'a' sector, trunc(sysdate)-2 dt, 4 from dual union all 
    select 'a' sector, trunc(sysdate)-3 dt, 128 from dual union all 
    select 'a' sector, trunc(sysdate)-4 dt, 8 from dual union all 
    select 'a' sector, trunc(sysdate)-5 dt, 16 from dual union all 
    select 'a' sector, trunc(sysdate)-6 dt, 32 from dual union all 
    select 'a' sector, trunc(sysdate)-7 dt, 256 from dual union all 
    select 'a' sector, trunc(sysdate)-8 dt, 1 v from dual union all 
    select 'a' sector, trunc(sysdate)-9 dt, 512 from dual union all 
    select 'b' sector, trunc(sysdate) dt, 3 from dual union all 
    select 'b' sector, trunc(sysdate)-1 dt, 27 from dual union all 
    select 'b' sector, trunc(sysdate)-2 dt, 9 from dual union all 
    select 'b' sector, trunc(sysdate)-3 dt, 81 from dual 
) 
select * from a 
model 
partition by (sector) 
dimension by (dt) 
measures (v, 0 mov_rank) 
rules 
(
    mov_rank[ANY] = median(v)[dt between CV()-3 and CV()] 
) 
order by sector, dt 
; 

उदाहरण अगर हम में के रूप में रैंक() के साथ मंझला की जगह काम नहीं करता:

with a as (
    select 'a' sector, trunc(sysdate) dt, 64 v from dual union all 
    select 'a' sector, trunc(sysdate)-1 dt, 2 from dual union all 
    select 'a' sector, trunc(sysdate)-2 dt, 4 from dual union all 
    select 'a' sector, trunc(sysdate)-3 dt, 128 from dual union all 
    select 'a' sector, trunc(sysdate)-4 dt, 8 from dual union all 
    select 'a' sector, trunc(sysdate)-5 dt, 16 from dual union all 
    select 'a' sector, trunc(sysdate)-6 dt, 32 from dual union all 
    select 'a' sector, trunc(sysdate)-7 dt, 256 from dual union all 
    select 'a' sector, trunc(sysdate)-8 dt, 1 v from dual union all 
    select 'a' sector, trunc(sysdate)-9 dt, 512 from dual union all 
    select 'b' sector, trunc(sysdate) dt, 3 from dual union all 
    select 'b' sector, trunc(sysdate)-1 dt, 27 from dual union all 
    select 'b' sector, trunc(sysdate)-2 dt, 9 from dual union all 
    select 'b' sector, trunc(sysdate)-3 dt, 81 from dual 
) 
select * from a 
model 
partition by (sector) 
dimension by (dt) 
measures (v, 0 mov_rank) 
rules 
(
    mov_rank[ANY] = rank() over (order by v)[dt between CV()-3 and CV()] 
) 
order by sector, dt 
; 

मैं किसी भी मदद की सराहना करेंगे।

धन्यवाद।

+0

ranke() एक टाइपो है? – Bulat

उत्तर

2

यह हो सकता है एक छोटे से "पुराने जमाने", लेकिन आप विश्लेषिकी या model के बजाय एक स्वयं में शामिल होने का उपयोग कर एक समान परिणाम प्राप्त करने, की तरह कुछ में के रूप में सक्षम हो सकता है:

with a as (
    select 'a' sector, trunc(sysdate) dt, 64 v from dual union all 
    select 'a' sector, trunc(sysdate)-1 dt, 2 from dual union all 
    select 'a' sector, trunc(sysdate)-2 dt, 4 from dual union all 
    select 'a' sector, trunc(sysdate)-3 dt, 128 from dual union all 
    select 'a' sector, trunc(sysdate)-4 dt, 8 from dual union all 
    select 'a' sector, trunc(sysdate)-5 dt, 16 from dual union all 
    select 'a' sector, trunc(sysdate)-6 dt, 32 from dual union all 
    select 'a' sector, trunc(sysdate)-7 dt, 256 from dual union all 
    select 'a' sector, trunc(sysdate)-8 dt, 1 v from dual union all 
    select 'a' sector, trunc(sysdate)-9 dt, 512 from dual union all 
    select 'b' sector, trunc(sysdate) dt, 3 from dual union all 
    select 'b' sector, trunc(sysdate)-1 dt, 27 from dual union all 
    select 'b' sector, trunc(sysdate)-2 dt, 9 from dual union all 
    select 'b' sector, trunc(sysdate)-3 dt, 81 from dual 
) 
select 
    a.sector, 
    a.dt, 
    a.v, 
    count(case when self.v < a.v then self.v end) + 1 mov_rank 
from 
    a, 
    a self 
where 
    self.sector = a.sector 
    and 
    self.dt between a.dt - 3 and a.dt + 3 
group by 
    a.sector, 
    a.dt, 
    a.v 
order by 
    a.sector, 
    a.dt, 
    a.v; 
संबंधित मुद्दे