Как сохранить результат выбора в новый столбец из той же таблицы? - PullRequest
1 голос
/ 18 апреля 2019

Я использую DB2 IBM.У меня есть таблица stockdb(date, close) Я рассчитываю ее скользящее среднее за 30 дней и сохраняю ее в той же таблице.

alter stockdb 
add ma as avg("close") 
over
(order by "date" rows between 29 preceding and current row)
from stockdb;

Ответы [ 3 ]

1 голос
/ 18 апреля 2019

Вы не можете сделать это как вычисляемый столбец, потому что оконные функции не разрешены. Вместо этого используйте вид:

create view v_stockdb as 
    select s.*,
           avg("close") over (order by "date" rows between 29 preceding and current row) as ma
    from stockdb s;
0 голосов
/ 18 апреля 2019

без данных примера; Я предполагаю, что у вас есть 1 строка на дату, и закрытие может быть закрытой розничной стоимостью или что-то для магазина?

Можете ли вы достичь того, что вы хотите, делая это;

  1. Добавьте средний столбец к вашей таблице - я сделал его 9,2 десятичным;
    ALTER TABLE STOCKDB                      
    ADD COLUMN MA DEC (9 , 2) NOT NULL WITH DEFAULT;
  1. Обновите вашу таблицу, добавив средние значения в этот столбец;
UPDATE STOCKDB B                                        
   SET MA = (SELECT XMA                                         
               FROM (                                           
                SELECT "DATE",AVG("CLOSE")                      
                       OVER (ORDER BY "DATE" ROWS               
                       BETWEEN 29 PRECEDING AND CURRENT ROW) XMA
                FROM RAKELLR/STOCKDB) Z                         
              WHERE Z."DATE" = B."DATE")         

Таким образом, вы строите свою дату и средние значения в таблице «Z» - вызывая строку среднего значения XMA;

    SELECT "DATE",AVG("CLOSE")                      
           OVER (ORDER BY "DATE" ROWS               
           BETWEEN 29 PRECEDING AND CURRENT ROW) XMA
    FROM STOCKDB) Z; 

Затем вы обновите свою таблицу STOCKDB, установив для столбца MA значение = XMA, где совпадает дата;

UPDATE STOCKDB B                                        
   SET MA = (SELECT XMA                                         
               FROM (...Z...)                         
              WHERE Z."DATE" = B."DATE");
0 голосов
/ 18 апреля 2019
INSERT INTO stockdb 
( date, 
  close, 
  ma
) 
VALUES 
( 
  CURRENT DATE,
  1.00,
  (select avg("close") 
          over (order by "date" rows between 29 preceding and current row ) 
    from stockdb )
)

Значения являются произвольными, я мог бы / должен был использовать bind parms (?) Так же легко. Я заметил, что на вашем столе нет символов, открытых, высоких или низких, поэтому их нужно будет добавить, если вы измените таблицу.

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