Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Аналитическая функция - как выкрутить?  [new]
Amberit
Member

Откуда: Киев
Сообщений: 765
Привет уважаемому сообществу!
Есть задачка, и подозреваю, что есть решение более элегантное, чем у меня...

Тестовые данные:

WITH w_data AS (
    SELECT      LEVEL AS amnt
    FROM        dual
    CONNECT BY  LEVEL <= 30
    
)
SELECT  d.amnt,
        SUM(d.amnt) OVER(ORDER BY d.amnt) AS CUM_amnt,
        SUM(d.amnt) OVER(ORDER BY d.amnt) - d.amnt AS CUM_amnt_PREV
FROM    w_data d;


Что необходимо:

Есть ли способ посчитать CUM_amnt_PREV без операции вычитания, с использованием только одной аналитической функции?
К сожалению, я не нашел возможности задать окно диапазона, чтобы функция считала значения с первого по текущее - 1 (типа ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW - 1).

Хотелось бы решить эту задачку без подзапросов. К тому же, в реальной системе значение d.amnt представляет из себя достаточно сложное выражение, и приходится в подзапросе сначала вычислять это выражение, а потом использовать его в аналитической функции...
17 янв 14, 12:09    [15429082]     Ответить | Цитировать Сообщить модератору
 Re: Аналитическая функция - как выкрутить?  [new]
Добрый Э - Эх
Guest
Amberit,

WITH w_data AS (
    SELECT      LEVEL AS amnt
    FROM        dual
    CONNECT BY  LEVEL <= 30
    
)
SELECT  d.amnt,
        SUM(d.amnt) OVER(ORDER BY d.amnt) AS CUM_amnt,
        SUM(d.amnt) OVER(ORDER BY d.amnt) - d.amnt AS CUM_amnt_PREV,
        SUM(d.amnt) OVER(ORDER BY d.amnt ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING) AS CUM_amnt_PREV_x
FROM    w_data d;
17 янв 14, 12:14    [15429135]     Ответить | Цитировать Сообщить модератору
 Re: Аналитическая функция - как выкрутить?  [new]
-2-
Member

Откуда:
Сообщений: 15330
Amberit
приходится в подзапросе сначала вычислять это выражение, а потом использовать его в аналитической функции...
Два разных окна могут оказаться хуже по производительности.
17 янв 14, 12:16    [15429157]     Ответить | Цитировать Сообщить модератору
 Re: Аналитическая функция - как выкрутить?  [new]
Amberit
Member

Откуда: Киев
Сообщений: 765
Добрый Э - Эх,

автор
SUM(d.amnt) OVER(ORDER BY d.amnt ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING)


Спасибо, это оно... :-)
17 янв 14, 12:18    [15429174]     Ответить | Цитировать Сообщить модератору
 Re: Аналитическая функция - как выкрутить?  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 10052
Добрый Э - Эх
       SUM(d.amnt) OVER(ORDER BY d.amnt) - d.amnt AS CUM_amnt_PREV,
        SUM(d.amnt) OVER(ORDER BY d.amnt ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING) AS CUM_amnt_PREV_x


Ну тут как сказать. В общем случае они не эквивалентны. Например, если amnt NULL то первое даст NULL а второе не обязательно. Ну и даже если amnt NOT NULL для первой строки первое выражение вернет 0 а второе NULL.

SY.
17 янв 14, 18:10    [15431676]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить