GROUP BY自定义汇总

时间:2016-05-29 05:12:37

标签: sql postgresql group-by aggregate-functions greatest-n-per-group

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

但是我现在需要以下启发式而不是使用max:

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 个答案:

答案 0 :(得分: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);

我不希望你需要什么。