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); 

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