Полный вопрос переписать
Я ищу агрегатную функцию First ().
Здесь я нашел то, что почти работает:
CREATE OR REPLACE FUNCTION public.first_agg ( anyelement, anyelement )
RETURNS anyelement LANGUAGE sql IMMUTABLE STRICT AS $$
SELECT $1;
$$;
-- And then wrap an aggregate around it
CREATE AGGREGATE public.first (
sfunc = public.first_agg,
basetype = anyelement,
stype = anyelement
);
Проблема в том, что когда столбец varchar (n) проходит через функцию first (), он преобразуется в простой varchar (без размера). Пытаясь вернуть запрос в функции как RETURNS SETOF anyelement, я получаю следующую ошибку:
ОШИБКА: структура запроса не соответствует типу результата функции. Estado de SQL: 42804 Подробная информация: Изменение символа возвращаемого типа не соответствует ожидаемому изменению символа типа (40) в столбце 2. Контекст: функция PL / pgSQL vsr_table_at_time (anyelement, отметка времени без часового пояса) ) строка 31 в RETURN QUERY
На той же вики-странице есть ссылка на C-версию функции , которая заменит вышеперечисленное. Я не знаю, как его установить, но мне интересно, сможет ли эта версия решить мою проблему.
Между тем, есть ли способ изменить вышеуказанную функцию, чтобы она возвращала точно такой же тип входного столбца?
источник
DISTINCT ON
в этом случае работать не будет. Это не агрегатная функция, вы на самом деле фильтруете данные и можете сделать это только один раз.Да, я нашел простой способ с вашим делом, используя некоторые функции в PostgreSQL 9.4+
Давайте посмотрим на этот пример:
Я надеюсь, что это поможет вам в вашем случае.
источник
DOMAIN
типами данных или другими небольшими исключениями. Это также намного сложнее и занимает больше времени, создавая массив всего набора данных. Простым решением было бы создание пользовательского агрегата, но до сих пор я не нашел идеального решения даже с этим. Оконные функции также плохие, так как их нельзя использовать так же, как вы могли бы использовать агрегаты (с операторами FILTER или в CROSS JOIN LATERAL)Не прямой ответ на ваш вопрос, но вы должны попробовать
first_value
оконную функцию. Это работает так:);
Затем, если вам нужен первый элемент в каждой
cat
(категории), вы будете делать запрос следующим образом:или:
источник
select distinct x, first_value(y) over (partition by x), first_value(z) over (partition by x) from ...
. Вероятно, неэффективно, но достаточно для меня, чтобы продолжить прототипирование. Определенно что-то, чтобы вернуться, хотя!