0

我想通過下面的聚合通過子查詢進行分組(我將查詢簡化爲其最基本的形式,group by n查詢)。GROUP BY自定義聚合

但是,而不是使用最大,我現在需要以下啓發:

bar範圍爲0-2。我想按照順序從2,0,1中選擇。但我然後想要原始加入原始bar

我可以寫一個自定義的聚合函數來返回正確的屬性嗎?我對這兩者如何結合有點失望。

SELECT 
    FOO.bar2 
FROM 
    FOO 
INNER JOIN(
    SELECT 
     FOO.id, 
     custom_aggrgate(bar) 
    FROM 
     FOO      
    GROUP BY 
     FOO.id    
    ) b ON FOO.bar = inverse_of_custom_aggrgate(bar) -- get org. value of bar to join by 
+1

你能提供一個輸入值和你正在尋找的輸出的例子。 – Alex

回答

1

簡單的解決辦法是用DISTINCT ONCASE表達ORDER BY

我想這是你真正想要什麼

SELECT DISTINCT ON (id) bar2 
FROM foo 
ORDER BY id, CASE bar WHEN 2 THEN -1 ELSE bar END; 

無需自定義聚合功能。
不需要再次加入。
不需要函數來反轉所述自定義聚合函數的結果。

關於DISTINCT ON


的問題的查詢語法無效,可能不是你想要的。修正語法如下:

SELECT FOO.bar2 
FROM FOO 
INNER JOIN (
    SELECT FOO.id, custom_aggrgate(bar) AS bar 
    FROM FOO      
    GROUP BY FOO.id    
    ) b ON FOO.bar = inverse_of_custom_aggrgate(b.bar);

但是,這可能仍然是無稽之談。如果bar未定義爲唯一(在您的方案中似乎不可能),則會得到許多重複行。這個可疑的查詢等效於:

SELECT f.bar2 
FROM foo f 
JOIN (
    SELECT DISTINCT ON (id) bar 
    FROM foo 
    ORDER BY id, CASE bar WHEN 2 THEN -1 ELSE bar END 
    ) b USING (bar); 

我不指望這就是你需要的。