创建自定义窗口功能

时间:2013-10-25 03:10:03

标签: postgresql

我有参加活动的团队表。

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

对于每个团队,我都试图在每个年龄组中获得排名(请注意,superveteran类别也包含ultraveterans,退伍军人包含以前的类别,open包含所有类别)。

我可以通过以下查询获得退伍军人的排名:

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

你可以看到它并不是很好。因为我有五个类别,所以整个查询开始变得非常混乱(并且每个类别中我有另外五个相似的“列”)。

我以为我会创建窗口函数来简化它但是当我定义了我的窗口函数时(这个btw上几乎没有任何文档)我甚至无法让它返回传递给它的参数。

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语言编写时效率会更高,但结果会被缓存,因此无关紧要。

1 个答案:

答案 0 :(得分:3)

SQL中的自定义窗口聚合,实际上不支持PL / pgSQL。目前,没有办法做到这一点。

有关详细信息,请查看this thread