2013-10-25 201 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/ –