oracle вычисляет среднее значение текущей и предыдущей строки - PullRequest
0 голосов
/ 31 октября 2018

У меня есть следующая таблица, которая содержит один столбец VALUE1, я хотел бы рассчитать среднее значение между предыдущей строкой и текущей строкой в ​​VALUE1 и представить его во втором столбце VALUE2, начиная со второй строки, т.е. значение первой строки будет не усредняется.

Результат должен выглядеть как

ID VALUE1 VALUE2
1   3        3  
2   4        3.5
3   5         4.5
4   5         5
5   6         5.5
6   2         4

ПРИМЕЧАНИЕ. Для первого ряда (ID = 1) я усредняю ​​первый ряд с самим собой.

Любая помощь приветствуется. Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 31 октября 2018

Вы также можете использовать аналитическую функцию AVG() с окном предыдущей и текущей строки:

WITH practicenew AS (SELECT 1 ID, 3 value1 FROM dual UNION ALL
                     SELECT 2 ID, 4 value1 FROM dual UNION ALL
                     SELECT 3 ID, 5 value1 FROM dual UNION ALL
                     SELECT 4 ID, 5 value1 FROM dual UNION ALL
                     SELECT 5 ID, 6 value1 FROM dual UNION ALL
                     SELECT 6 ID, 2 value1 FROM dual)
SELECT ID,
       value1,
       AVG(value1) OVER (ORDER BY ID
                         ROWS BETWEEN 1 PRECEDING AND CURRENT ROW) value2
FROM   practicenew;

        ID     VALUE1     VALUE2
---------- ---------- ----------
         1          3          3
         2          4        3.5
         3          5        4.5
         4          5          5
         5          6        5.5
         6          2          4
0 голосов
/ 31 октября 2018

Я думаю, что вы можете использовать этот запрос, он дает тот же результат, который вы упомянули.

Сценарий создания таблицы:

create table practicenew (ID   number, Value1   number)  ;
insert into practicenew (ID, Value1) values (1, 3) ;
insert into practicenew (ID, Value1) values (2,4) ;
insert into practicenew (ID, Value1) values (3,5);
insert into practicenew (ID, Value1) values (4,5);
insert into practicenew (ID, Value1) values (5,6);
insert into practicenew (ID, Value1) values (6,2 ); 

Затем используйте функцию NVL и Lag. Lag перенесет ваше предыдущее значение в текущую строку, а nvl используется для первой строки, так как при использовании lag у вас будет нулевое значение в первой строке.

 Query: select ID, value1,nvl(((lag(value1) over (order by ID) + value1)/2),value1)  as Value2 
 from practicenew; 

Выход:

 ID    Value1    Value2
   1    3        3
   2    4        3.5  
   3    5        4.5
   4    5        5
   5    6        5.5
   6    2        4

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...