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 ON
和 ORDER 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);
我不希望这就是你需要的。
我试图通过下面的聚合按子查询分组(我将查询简化为最基本的形式,group by n
查询)。
但我现在需要以下试探法,而不是使用最大值:
bar
范围为 0-2。我想按顺序从 2,0,1 中选择。但是我想在 bar
.
我可以向 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 ON
和 ORDER 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);
我不希望这就是你需要的。