У меня есть таблица команд, участвующих в мероприятиях.Создание пользовательской функции окна
id,
event_id,
gender enum('men', 'mixed', 'women'),
age enum('ultraveteran', 'superveteran', 'veteran', 'open', 'junior'),
score
Для каждой команды я пытаюсь получить ранг в каждой из возрастных категорий (обратите внимание, что суперветераны категория содержит ultraveterans, ветераны содержат как предыдущие категории и открытым содержит все категории).
я могу получить звание для ветеранов с помощью следующего запроса:
select id, (case age in ('ultraveteran', 'superveteran', 'veteran') then
row_number() over (partition by event_id, gender, age in ('ultraveteran', 'superveteran', 'veteran')
order by score desc)
else null end) as rank_v
Это не очень хорошо, как вы можете видеть. Поскольку у меня есть пять категорий, весь запрос начинает выглядеть довольно грязным (и у меня есть еще пять похожих «столбцов» для количества команд в каждой категории).
Я думал, что создам функцию окна, чтобы немного упростить ее, но когда я определил свою функцию окна (там почти нет документации по этому каналу), я даже не мог ее вернуть, передав ей аргумент.
select class_rank('veteran', 'open') over (partition by event_id, gender) as one
from team where event_id in (11,19);
create or replace function class_rank(ranked_class text, team_class text)
returns text as $$
select ranked_class;
$$
language 'sql' window;
Я подумал, что Postgre не поддерживает SQL функции окна, как
Это в настоящее время используется только для функций, написанных на C
было указано в docs (раздел Параметры → WINDOW), но он не выдал никакой ошибки и только вернул null, поэтому я попробовал select 'foo'::text
, и этот файл работал, поэтому я предполагаю, что вы также можете определить функции окна SQL.
Как создать функцию так, чтобы она правильно принимала аргументы?
P.S .: Я знаю, что это было бы намного более эффективно при написании на C, но результаты кэшируются, так что это не имеет большого значения.
О, pl/v8 выглядит так, как будто он работает, и я могу использовать javascript сейчас. Тем не менее это странно, что создание оконной функции sql не вызывает никакой ошибки и даже работает, когда я выбираю статический текст. –
@JanTojnar Я посмотрел туда - это небольшая ошибка - вы не можете создать полезную функцию окна там. Если вы можете, сообщите об этом как об ошибке на http://www.postgresql.org/list/pgsql-bugs/ –