Функции Oracle Analytic - Как повторно использовать предложение PARTITION BY? - PullRequest
8 голосов
/ 29 марта 2011

Я написал сложный запрос SQL с Oracle, в котором я хочу использовать две аналитические функции для одного раздела.

Давайте будем довольно простыми, но не слишком:

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;

Существует ли более элегантный синтаксис для факторизации предложения PARTITION BY?

Спасибо.

Ответы [ 2 ]

12 голосов
/ 29 марта 2011

Если вы ссылаетесь на стандартное предложение WINDOW, например:

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

тогда я считаю, что ответ нет , Oracle не поддерживает это (проверено с 11gR2).

5 голосов
/ 29 марта 2011

Вы можете использовать факторинг подзапроса, также известный как предложение with:

(непроверенные)

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

С уважением,
Роб.

...