2013-10-25 7 views
2

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

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, но результаты кэшируются, так что это не имеет большого значения.

ответ

3

Пользовательские агрегаты окон в SQL, PL/pgSQL на самом деле не поддерживаются. В настоящее время нет никакого способа сделать это.

Для получения дополнительной информации см. this thread.

+0

О, pl/v8 выглядит так, как будто он работает, и я могу использовать javascript сейчас. Тем не менее это странно, что создание оконной функции sql не вызывает никакой ошибки и даже работает, когда я выбираю статический текст. –

+0

@JanTojnar Я посмотрел туда - это небольшая ошибка - вы не можете создать полезную функцию окна там. Если вы можете, сообщите об этом как об ошибке на http://www.postgresql.org/list/pgsql-bugs/ –

Смежные вопросы