GROUP BY 自定义聚合

GROUP BY custom aggregate

我试图通过下面的聚合按子查询分组(我将查询简化为最基本的形式,group by n 查询)。

但我现在需要以下试探法,而不是使用最大值:

bar 范围为 0-2。我想按顺序从 2,0,1 中选择。但是我想在 bar.

original 值上加入 original

我可以向 return 右侧 属性 编写自定义聚合函数吗?我对如何将两者结合起来有些迷茫。

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

最简单的解决方案是 DISTINCT ONORDER BY 中的 CASE 表达式:

我想这就是你真正想要的:

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

无需自定义聚合函数。
无需再次加入。
不需要函数来反转所述自定义聚合函数的结果。

关于DISTINCT ON

  • Select first row in each GROUP BY group?

问题中的查询语法无效,可能不是您想要的。语法固定后,它可能看起来像这样:

SELECT FOO.bar2
FROM   FOO
INNER  JOIN (
    SELECT FOO.id, custom_aggrgate(bar) <b>AS bar</b>
    FROM   FOO                    
    GROUP  BY FOO.id            
    ) b ON FOO.bar = inverse_of_custom_aggrgate(<b>b.</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);

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