Неверная операция: подзапрос должен возвращать только один столбец - Amazon Redshift - PullRequest
2 голосов
/ 28 июня 2019

Я вставил изображение с wat o / pi. Надеюсь, это поможет

enter image description here

Я пытаюсь рассчитать процент отдельных строк с общимодного конкретного столбца.

Я могу добиться этого в операторе SELECT с псевдонимом, но у меня есть дальнейшие вычисления с помощью столбца per, где я получаю другие столбцы, поэтому мне нужно этобыть в UPDATE запросе.Я попытался выполнить приведенный ниже запрос, но получаю сообщение об ошибке:

Недопустимая операция: подзапрос должен возвращать только один столбец

У меня нет уникального идентификатора.Я не могу использовать IN заявления в этом.

Куда я иду не так?

UPDATE a
SET per = (SELECT DISTINCT
             code,
             p,
             pd,
             ratio_to_report(SUM(amnt)) OVER (PARTITION BY p) AS per
           FROM a 
           GROUP BY code,p,pd
           )
WHERE per IS null;

Ответы [ 2 ]

0 голосов
/ 01 июля 2019

Ваш подзапрос возвращает несколько значений и несколько строк .Вам необходимо точно указать Redshift, как применить все возвращаемые значения и строки к таблице, являющейся UPDATE 'ed.

Например:

UPDATE tbl_a
SET tbl_a.per = code_sum.per
FROM tbl_a
JOIN (SELECT code
           , SUM(amnt) AS per
      FROM tbl_a
      GROUP BY code
     ) code_sum
   ON tbl_a.code = code_sum.code
WHERE per IS NULL
;

Примечание: для лучшей скорости запросов не добавляйте DISTINCT к своим запросам, если только вы не уверены, что вам нужны четкие результаты.Вы просите Redshift выполнить дополнительное действие, которое не является необходимым, поскольку у вас уже есть GROUP BY в тех же столбцах.Часто Redshift может пропустить дополнительный шаг DISTINCT, но не всегда.

0 голосов
/ 29 июня 2019

Вы пытаетесь обновить 1 столбец с 4 значениями. Представьте себе это без подзапроса:

UPDATE a
SET per = code, p, pd, per
WHERE per IS null;

Ваш подзапрос должен возвращать один столбец и строку.

...