gpt4 book ai didi

postgresql - 创建自定义窗口函数

转载 作者:行者123 更新时间:2023-11-29 12:05:41 24 4
gpt4 key购买 nike

我有参加事件的团队表。

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

对于每个团队,我都试图获得每个年龄类别的排名(请注意, super 退伍军人类别也包含超退伍军人,退伍军人包含之前的类别,而开放包含所有类别)。

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

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 窗口函数作为

This is currently only useful for functions written in C

docs 中说明(部分参数 → WINDOW)但它没有抛出任何错误并且只返回 null 所以我尝试了 select 'foo'::text 并且这个有效所以我假设你也可以定义 SQL 窗口函数.

如何创建函数以使其正确接受参数?

P.S.:我知道用 C 编写时效率会高得多,但结果会被缓存,所以这无关紧要。

最佳答案

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

有关更多信息,请参阅 this thread .

关于postgresql - 创建自定义窗口函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19580448/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com