创建自定义窗口函数

Posted

技术标签:

【中文标题】创建自定义窗口函数【英文标题】:Creating custom window function 【发布时间】:2013-10-25 03:10:03 【问题描述】:

我有参加活动的团队表。

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

对于每支球队,我试图在每个年龄类别中获得排名(请注意,superveteran 类别也包含 ultraveterans,vegeters 包含以前的类别,而 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 编写的函数有用

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

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

P.S.:我知道用 C 编写会更有效率,但结果会被缓存,所以没那么重要。

【问题讨论】:

【参考方案1】:

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

欲了解更多信息,请查看this thread。

【讨论】:

哦,pl/v8 看起来正在运行,我现在可以使用 javascript。仍然很奇怪,创建 sql 窗口函数不会引发任何错误,甚至在我选择静态文本时也可以工作。 @JanTojnar 我看过那里 - 这是一个小错误 - 你不能在那里创建有用的窗口函数。如果可以,请将其作为错误报告给postgresql.org/list/pgsql-bugs 这仍然是真的吗?我看到一些关于 moving-aggregate 模式的文档,该模式与使用聚合函数和窗口查询有关。 可能是无效的 - 过去六年有很多变化。

以上是关于创建自定义窗口函数的主要内容,如果未能解决你的问题,请参考以下文章

创建自定义 fltk 对话框/模态窗口

自定义Hooks函数获取窗口大小

如何为 Presto 编写自定义窗口函数?

P10:自定义Hooks函数获取窗口大小

Hive常用内置函数窗口函数及自定义函数

创建自定义窗口大小调整功能