2011-03-29 19 views
8

Aynı bölüm üzerinden iki analitik işlev kullanmak istediğim karmaşık bir SQL sorgusu Oracle ile yazdım.Oracle Analitik işlevler - PARTITION BY deyimi nasıl kullanılır?

en çok oldukça basit ama olalım: PARTITION BY maddesini faktoring daha zarif sözdizimi

SELECT col1, 
     MAX(col2) OVER(PARTITION BY col3, col4, col5, col6, 
            CASE WHEN col7 LIKE 'foo' 
             THEN SUBSTR(col7,1,5) 
             ELSE col7 
            END 
            ORDER BY col5 ASC, col6 DESC), 
     MIN(col2) OVER(PARTITION BY col3, col4, col5, col6, 
            CASE WHEN col7 LIKE 'foo' 
             THEN SUBSTR(col7,1,5) 
             ELSE col7 
            END 
            ORDER BY col5 ASC, col6 DESC) 
    FROM my_table; 

var mı?

Teşekkür ederiz.

+0

Kullandığınız işlevlerin "MAX" ve "MIN" ve ayrıca "col5" ve "col6" nın "bölüm" ve "sırayla" olduğu göz önünde bulundurulduğunda, her sütun için "by" deyimi görüntülenir. gereksiz olmak. –

+0

Haklısınız, ancak bu basit bir örnek olarak tasarlanmıştır, LAST_VALUE veya başka bir analitik olabilir. – Benoit

+0

[Aynı Bölüme Birden Fazla Pencere İşlevinin Uygulanması] 'nın olası kopyası (http://stackoverflow.com/questions/1896102/applying-multiple-window-functions-on-same-partition). Bu kopya bulmak kolay değildi. – Benoit

cevap

12

böyle standart PENCERE maddesine istinaden ediyorsanız:

SELECT col1, 
     MAX(col2) OVER(w), 
     MIN(col2) OVER(w) 
FROM my_table 
WINDOW w AS (PARTITION BY col3, col4, col5, col6, 
           CASE WHEN col7 LIKE 'foo' 
            THEN SUBSTR(col7,1,5) 
            ELSE col7 
           END 
           ORDER BY col5 ASC, col6 DESC); 

sonra cevap hiçbir olduğuna inanıyoruz, Oracle (11gR2 ile işaretli) bu desteklemez.

+0

İstediğim şey bu! Teşekkür ederim. – Benoit

+0

@Benoit: ama maalesef ** çalışmıyor ** Oracle'da çalışıyor! –

+0

Sadece onu kullanmaya çalıştığımı fark ettim. Çok fena. – Benoit

5

Ayrıca olarak bilinen alt sorgu factoring kullanabilirsiniz ile-fıkra:

(denenmemiş)

with t as 
(select col1 
     , col2 
     , col3 
     , col4 
     , col5 
     , col6 
     , case col7 
     when 'foo' then 
      substr(col7,1,5) 
     else 
      col7 
     end col7 
    from my_table 
) 
select col1 
    , max(col2) over (partition by col3,col4,col5,col6,col7 order by col5,col6 desc) 
    , min(col2) over (partition by col3,col4,col5,col6,col7 order by col5,col6 desc) 
    from t 

Selamlar,
Rob.

+0

Evet, ama yine de biraz uzun. Ancak, Oracle'da harika bir anahtar kelime olan "WITH" i öneren +1. – Benoit

+0

"t. *, [Case expression] 'i mytable t'den new_col7 olarak seçin" ve "new_col7" ifadesini sorguda kullanabilirsiniz. –

+0

Yine de, bu gerçekten kök problemini çözmeyecektir: kodunuzda yine de (bölümleme ...) parçasını tekrarlamaya devam edersiniz! – Benoit

İlgili konular