我有参加活动的团队表。
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
如您所见,这不是很好。因为我有五个类别,所以整个查询开始看起来很混乱(我还有另外五个类似的“列”来表示每个类别中的团队数量)。
我想我会创建窗口函数来简化它,但是当我定义我的窗口函数时(顺便说一句,几乎没有任何文档),我什至无法让它返回传递给它的参数。
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 编写的函数有用
在文档(参数 → WINDOW 部分)中进行了说明,但它没有引发任何错误,只返回 null 所以我尝试select 'foo'::text
了这个工作,所以我假设你也可以定义 SQL 窗口函数。
如何创建函数以使其正确接受参数?
PS:我知道这在用 C 语言编写时会更有效,但结果会被缓存,所以没那么重要。