Ошибка вставки Athena в новое значение: посторонний ввод «ВСТАВИТЬ» ожидает {‘(‘, ‘,’, ‘ ВЫБЕРИТЕ’, ‘ЗНАЧЕНИЯ’, ‘ТАБЛИЦА’}

#sql #amazon-athena

#sql #amazon-athena

Вопрос:

схема user_db выглядит следующим образом:

   2020-03  11         80     121
  2020-04  20         30     121
  2020-05  13         99     121
  2020-06  12         19     121
......    
  

старая пользовательская база данных похожа на :

 month,user_count, total, grand_total, percentage_old, total_percentage_old
....
2020-06    20       30      121       73.3%           18.1%


  

Необходимо обновить значение percentage, total_percentage из и более старые данные записи базы данных percentage_old, total_percentage_old с июня в запросе Athena,

 with user_db as (
select *, user_count/total*100 as percentage, user_count/grand_total*100 as total_percentage
)

INSERT INTO  user_db (percentage,total_percentage) 
select percentage_old, total_percentage_old
from old_user_db  as u
where u.month = '2020-06'  
  

но получил эту ошибку:

посторонний ввод «ВСТАВИТЬ», ожидающий {‘(‘, ‘,’, ‘ ВЫБЕРИТЕ’, ‘ЗНАЧЕНИЯ’, ‘ТАБЛИЦА’}

Необходимо сохранить предложение with для повторного использования в другом запросе. Ожидайте получить таблицу user_db с процентами за июнь и total_percentage, используя более старое значение базы данных пользователя.

Комментарии:

1. Образцы данных и желаемые результаты действительно помогли бы.

2. Athena не поддерживает добавление полей в существующие строки. INSERT INTO всегда будет добавлять новую строку.

Ответ №1:

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

WITH user_db (…) определяет временную связь user_db , которая существует только во время выполнения запроса. Если у вас уже есть таблица user_db , она будет затенена этим отношением. INSERT INTO user_db невозможно вставить в это отношение, потому что оно действительно не существует как таковое.

В user_db отношении также нет FROM предложения, которое не поддерживается, Athena не будет знать user_count , откуда берутся столбцы , total , и grand_total .

Я не знаю, возможно ли написать подобные инструкции insert в других базах данных, я никогда этого не видел. В любом случае это не поддерживается в Athena. Посмотрите INSERT INTO документацию, если хотите узнать больше о том, что поддерживается.

Я подозреваю, что вы пытаетесь сделать что-то подобное, но я не совсем уверен:

 INSERT INTO user_db (month, user_count, percentage, total_percentage) 
SELECT
  month,
  user_count,
  user_count/total * 100,
  user_count/grand_total * 100
FROM old_user_db
WHERE month = '2020-06'
  

Вам нужно будет предоставить дополнительную информацию, если вам нужна более подробная справка.

Ответ №2:

попробуйте переместить «ВСТАВИТЬ В user_db (процент, total_percentage) » в первую строку