Вернуть таблицу из пользовательской функции в Redshift - PullRequest
0 голосов
/ 22 апреля 2019

У меня сложный запрос, который дает несколько строк для некоторых двух дат - даты начала и окончания.

Теперь я хочу создать функцию, чтобы я мог возвращать несколько строк для разных комбинаций дат.

CREATE FUNCTION submit_cohort(DATE, DATE)
RETURNS TABLE(Month VARCHAR(10), Name1 VARCHAR(20), Name2 VARCHAR(20), x INTEGER)
STABLE
AS $$
  SELECT
    to_char((date + interval '330 minutes')::date, 'YYYY/MM') "Month",
    Name1,
    Name2,
    count(*) "x"
  FROM xyz
  WHERE date > $1
    AND date < $2
  GROUP BY 1,2,3
  ORDER BY 1,2,3
END 
$$ LANGUAGE sql;

Я выполнил этот запрос. Там написано:

Amazon Недопустимая операция: синтаксическая ошибка в или рядом с "TABLE"

1 Ответ

2 голосов
/ 22 апреля 2019

В Redshift вы можете определять только скалярные функции, то есть те, которые возвращают одно значение.Функции, основанные на множестве (те, которые возвращают таблицы), к сожалению, не поддерживаются в Redshift.

Возможная причина в том, что Redshift является распределенной базой данных, и функции выполняются на вычислительных узлах параллельно, независимо друг от друга.Функции, основанные на множествах, должны иметь возможность считывать данные из базы данных, но есть вероятность, что некоторые данные находятся на данном узле, а другая часть - на другом.Такая функция не может работать на конкретном вычислительном узле независимо.Вы должны запустить такую ​​функцию только на главном узле.Что вы не хотели делать, так как это противоречит всей концепции параллелизма.

Попробуйте выразить ту же логику в запросе SQL.Из вашего кода кажется, что он может работать как обычный запрос / подзапрос.

...