2013-10-25 200 views
2

我有参与事件的团队表。创建自定义窗口功能

id, 
event_id, 
gender enum('men', 'mixed', 'women'), 
age enum('ultraveteran', 'superveteran', 'veteran', 'open', 'junior'), 
score 

对于每一支球队,我试图让每个年龄组的秩(注意superveteran类别还包括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/ –