我正在尝试通过下面的聚合按子查询进行分组(我将查询简化为最基本的形式,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
答案 0 :(得分:1)
最简单的解决方案是使用DISTINCT ON
和CASE
中的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);
我不希望你需要什么。