Можно ли использовать функцию «Выбрать из вставки в таблицу» в sql? - PullRequest
1 голос
/ 23 апреля 2020

Я получил следующий набор данных:

CREATE temp TABLE XXX (DATE TEXT, PRICE INTEGER);
INSERT INTO XXX VALUES 
('2019-04-27 01:00', 1), ('2019-04-27 02:30', 3), ('2019-04-27 18:00',2), 
('2019-04-28 17:00', 2), ('2019-04-28 21:00', 5), 
('2019-04-29 17:00',50), ('2019-04-29 21:00',10), 
('2019-04-30 17:00',10), ('2019-04-30 21:00',20), 
('2019-05-01 17:00',40), ('2019-05-01 21:00',10), 
('2019-05-02 17:00',10), ('2019-05-02 21:00', 6);

Затем я попытался использовать этот запрос, чтобы взять 2 последние строки из таблицы XXX и добавить их с date + 1 день и таким же price значения в таблицу XXX. В результате должны быть добавлены строки с датой 05-03.

with A as (
select * from XXX
order by DATE DESC),

B as (select * from (insert into A (DATE, PRICE),
select * from A
limit 2))

select * from B

Здесь я получил ошибку:

error at or near "insert"

Как можно решить эту проблему?

Ответы [ 2 ]

1 голос
/ 23 апреля 2020

Это то, что вы пытаетесь сделать?

with i as (
       insert into A (DATE, PRICE)
           select * 
           from XXX
           order by DATE TEXT DESC
           limit 2
           returning *
      )
select *
from i;
0 голосов
/ 23 апреля 2020

I думаю , вы просто хотите:

INSERT INTO xxx (date, price)
SELECT date + 1  -- adding a day to a date
     , price
FROM   xxx
ORDER  BY date DESC
LIMIT  2;

Это берет последние две строки в соответствии со столбцом date, добавляет день и вставляет новые строки.

При желании добавьте RETURNING *, чтобы также возвратить только что вставленные строки.

Может произойти разрыв, если ...

  • ... столбец date не является типом date (лучше не использовать базовые c имена типов в качестве идентификатора)
  • ... date не определено NOT NULL.
  • ... не совсем точно две строки для последнего дня.

Операция date + integer добавляет дни к дате в Postgres. Связанный:

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