Я обновляю значения столбцов таблицы с помощью инструкций UPDATE и SELECT. Но это не работает

Я обновляю столбец PREVIOUS_DAY_CLOSE, содержащий значения DAY_CLOSE-1.

Я использую функцию LAG() для получения значений PREVIOUS_DAY_CLOSE. Все работает нормально.

Но обновление столбца с помощью операторов UPDATE и SELECT, которые показывают ошибки.

ДЕНЬ ДЕНЬ_ОТКРЫТО ДЕНЬ_CLOSE PREVIOUS_DAY_CLOSE 29-05-2024 16879,35 16920,58 28 мая 2024 г. 16988.31 17019.88 24-05-2024 16879,35 16920,79 23 мая 2024 г. 16996,39 16736.03

Я попробовал запросы, показанные ниже, и получил следующие ошибки:

WITH t1 AS
(
    SELECT 
        datetime, 
        LAG(CLOSE) OVER (ORDER BY datetime) AS PREVIOUS_CLOSE 
    FROM
        stocks 
    WHERE 
        SYMBOL = 'NASDAQ:IXIC'
)
UPDATE STOCKS
SET PREVIOUS_CLOSE = t1.PREVIOUS_CLOSE
FROM t1
WHERE t1.datetime =STOCKS.datetime;

Я получаю эту ошибку:

ORA-00928: отсутствует ключевое слово SELECT

UPDATE STOCKS
SET PREVIOUS_CLOSE = (SELECT LAG(CLOSE) OVER (ORDER BY datetime) AS PREVIOUS_CLOSE 
                      FROM STOCKS  
                      WHERE SYMBOL = 'NASDAQ:IXIC');

Я получаю эту ошибку:

Ошибка SQL: ORA-01427: однострочный подзапрос возвращает более одной строки

см. stackoverflow.com/questions/7030699/…

Bart McEndree 30.05.2024 16:45
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
1
58
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вы не можете использовать CTE непосредственно для обновления, но можете как часть выбора внутри обновления. В любом случае вам нужно сопоставить обновление, чего вы не совсем делаете, поскольку основываете это только на datetime.

Как упоминалось в предыдущем вопросе, вам может потребоваться только предыдущее значение для отображения, которое вы можете получить с помощью простого запроса lag():

select symbol, datetime, open, close,
  lag(close) over (partition by symbol order by datetime) as previous_close
from stocks
СИМВОЛ ДАТАВРЕМЯ ОТКРЫТЬ ЗАКРЫВАТЬ PREVIOUS_CLOSE НАСДАК:IXIC 23 МАЯ 24 16996,39 16736.03 нулевой НАСДАК:IXIC 24 МАЯ 24 16879,35 16920,79 16736.03 НАСДАК:IXIC 28 МАЯ 24 16988.31 17019.88 16920,79 НАСДАК:IXIC 29 МАЯ 24 16879,35 16920,58 17019.88

Но поскольку вы хотите обновить таблицу напрямую, вы можете использовать это как подзапрос либо в обновлении с запросом к встроенному представлению:

update stocks s
set previous_close = (
  select previous_close
  from (
    select symbol, datetime,
      lag(close) over (partition by symbol order by datetime) as previous_close
    from stocks
  ) t
  where t.symbol = s.symbol and t.datetime = s.datetime
)

или то же самое, но с CTE вместо встроенного представления:

update stocks s
set previous_close = (
  with t (symbol, datetime, previous_close) as (
    select symbol, datetime,
      lag(close) over (partition by symbol order by datetime)
    from stocks
  )
  select previous_close
  from t
  where t.symbol = s.symbol and t.datetime = s.datetime
)

Или вы можете использовать merge вместо update:

merge into stocks s
using (
  select symbol, datetime,
    lag(close) over (partition by symbol order by datetime) as previous_close
  from stocks
) t
on (t.symbol = s.symbol and t.datetime = s.datetime)
when matched then update set s.previous_close = t.previous_close;

Все три имеют одинаковый результат;

select * from stocks order by symbol, datetime desc;
СИМВОЛ ДАТАВРЕМЯ ОТКРЫТЬ ЗАКРЫВАТЬ PREVIOUS_CLOSE НАСДАК:IXIC 29 МАЯ 24 16879,35 16920,58 17019.88 НАСДАК:IXIC 28 МАЯ 24 16988.31 17019.88 16920,79 НАСДАК:IXIC 24 МАЯ 24 16879,35 16920,79 16736.03 НАСДАК:IXIC 23 МАЯ 24 16996,39 16736.03 нулевой

рабочий пример

Я столкнулся с проблемой, когда присутствуют два символа, например: NASDAQ:META. Столбец PREVIOUS_CLOSE для NASDAQ:IXIC также обновляется случайным образом со значениями столбца NASDAQ:META CLOSE. Можете ли вы помочь мне, пожалуйста, помогите мне обновить значения PREVIOUS_CLOSE отдельно для каждого символа.

Logan 02.06.2024 15:56

Я включил partition by symbol и присоединился, используя этот столбец, чтобы избежать этого. Если это по-прежнему не работает, вам нужно будет задать новый вопрос с вашим текущим кодом, данными и результатами.

Alex Poole 02.06.2024 15:59

Я пробовал разделить по символу, но проблема все равно возникла. Меня заблокировали, чтобы я мог задавать новые вопросы.

Logan 02.06.2024 16:08
Работает с двумя символами. Я не знаю, что вы могли бы сделать по-другому.
Alex Poole 02.06.2024 16:26

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

Logan 02.06.2024 18:07

ваша основная проблема заключается в том, что ваш подзапрос (тот, который вы ВЫБИРАЕТЕ из АКЦИЙ) возвращает более одной строки, исправление этого поможет вам получить ожидаемые результаты.

PS: Не забудьте предложениеwhere во втором запросе, хе-хе

Другие вопросы по теме