Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Произведение нарастающим итогом / 5 сообщений из 5, страница 1 из 1
28.04.2018, 18:23
    #39638155
Roomon
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Произведение нарастающим итогом
Добрый день. Подскажите, пожалуйста, как можно создать столбец с произведением предыдущих чисел из соседнего столбца внутри своего ID.

Условно говоря, есть таблица из 3 столбцов ID, Period, Value и нужно добавить 4-й столбец New:

ID Period Value New1 1 2 21 2 3 61 3 4 241 4 5 1202 1 3 32 2 5 152 3 8 1202 4 9 1080

И в общем случае вопрос. Возможно ли заполнять столбец ссылаясь на предыдущее значение в этом же столбце? (то есть чтобы столбец New считался не на основе текущего и всех предыдущих значений в столбце Value, а на основе одного значения в столбце Value и одного предыдущего значения в столбце New). Спасибо.
...
Рейтинг: 0 / 0
28.04.2018, 18:28
    #39638157
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Произведение нарастающим итогом
Классический вариант не?
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
SQL> 
with t(ID,  Period, Val, expected_val) as (select 1, 1, 2, 2
from dual union all select 1, 2, 3, 6
from dual union all select 1, 3, 4, 24
from dual union all select 1, 4, 5, 120
from dual union all select 2, 1, 3, 3
from dual union all select 2, 2, 5, 15
from dual union all select 2, 3, 8, 120
from dual union all select 2, 4, 9, 1080
from dual )
------------------------------------------------
select id, period, val
     , power(10,sum(log(10,val)) over(partition by id order by period)) new_val
from t
;
        ID     PERIOD        VAL    NEW_VAL
---------- ---------- ---------- ----------
         1          1          2          2
         1          2          3          6
         1          3          4         24
         1          4          5        120
         2          1          3          3
         2          2          5         15
         2          3          8        120
         2          4          9       1080
8 rows selected

SQL> 
...
Рейтинг: 0 / 0
28.04.2018, 19:03
    #39638180
Roomon
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Произведение нарастающим итогом
andrey_anonymous, спасибо. Как-то не подумал про логарифм.. )

А при таком вычисление скажем на 1 млн строк без учета partition by (то есть если будет 1 млн разных значений, по которым будет делаться order by) СУБД будет учитывать расчет для предыдущей строчки? Или для строки 999 999 будет считаться произведение 999 999 значений, а для строки 1 000 000 будет заново считаться произведение 1 млн значений соответственно? (вопрос про быстродействие)
...
Рейтинг: 0 / 0
28.04.2018, 19:52
    #39638201
-2-
-2-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Произведение нарастающим итогом
Roomon(вопрос про быстродействие)explain plan
...
Рейтинг: 0 / 0
30.04.2018, 07:38
    #39638426
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Произведение нарастающим итогом
Roomonа для строки 1 000 000 будет заново считаться произведение 1 млн значений соответственно? (вопрос про быстродействие)Не волнуйся, до этой строки не дойдёт.
Код: plsql
1.
select power(2, 1e6) from dual;

...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Произведение нарастающим итогом / 5 сообщений из 5, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]