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語言編寫時效率會更高,但結果會被緩存起來,所以並不重要。
哦,PL/V8看起來像是在工作,我現在可以使用JavaScript。仍然是奇怪的創建SQL窗口函數不會拋出任何錯誤,甚至當我選擇靜態文本時工作。 –
@JanTojnar我看了那裏 - 這是一個小錯誤 - 你不能在那裏創建一個有用的窗口函數。如果可以,請將其報告爲http://www.postgresql.org/list/pgsql-bugs/ –