обновить таблицу с помощью функции LAG - PullRequest
0 голосов
/ 27 мая 2020

У меня есть таблица st_12_test.

CREATE TABLE public.st_12_test
(
  mmsi numeric,
  x1 double precision,
  y1 double precision,
  datetime timestamp without time zone,
  x2 double precision,
  y2 double precision,
  linetime double precision
)

Я пытаюсь удалить столбец x2 (который пуст), добавив значение предыдущей строки в столбец x1. Я могу просмотреть результаты, используя такой запрос:

SELECT  *, lag(x1,1) OVER (PARTITION BY mmsi) AS x2 FROM st_12_test;

, но я не могу обновить столбец x2 таблицы. Я получаю ОШИБКУ: невозможно использовать оконную функцию в ОБНОВЛЕНИИ, например, когда я пытаюсь запустить что-то вроде этого:

UPDATE st_12_test SET x2 = LAG(x1,1) OVER (PARTITION BY mmsi);

есть идея?

1 Ответ

0 голосов
/ 28 мая 2020

Вы можете создать CTE, который использует функцию LAG. Затем используйте полученные данные в Update ... From. Предполагая, что previous определяется на основе столбца datetime, тогда:

with ts12cte (mmsi, datetime, prev_x) as 
   ( select mmsi, datetime
          , lag(x1) over (partition by mmsi order by mmsi, datetime) 
       from st_12_test
   ) 
update st_12_test  st  
   set x2 = cte.prev_x   
  from ts12cte  cte
 where st.mmsi = cte.mmsi
   and st.datetime = cte.datetime;  

Поскольку вы не предоставили тестовые данные, он не был протестирован. Однако он проходит проверку синтаксиса.

...