gpt4 book ai didi

postgresql - 在 PostgreSQL 中按二元运算符分组

转载 作者:行者123 更新时间:2023-11-29 12:21:57 24 4
gpt4 key购买 nike

我正在使用 PostgreSQL 9.2.4。

问题

我有一个表,其中包含一个 ID 和某种类型的第二列。我们称该类型为 X。我还有一个二进制函数,它对一对 X 进行操作并返回一个 bool 值。我们将此函数称为 ff 是可传递的;即,如果 f(a,b)f(b,c) 都返回 true,则 f(a,c) 将作为好吧。

我想要做的是获取一组 ID,第二列的所有对都为这个二元函数返回 true。我怎样才能做到这一点?

性能不是一个大问题;这是每年大约只运行一次的导入过程的一部分。在此导入期间,数据库不会以其他方式使用。

(相对)简单的例子

我创建了一个 SQL Fiddle 来开始:http://sqlfiddle.com/#!12/57b97/3 .我想通过 f 函数的结果收集 ID。请记住,一般来说,f 可能更复杂。这只是一个例子。

我在这个示例 SQL Fiddle 中寻找的输出类似于以下内容:

{1,3,6}
{2,4}

例如,假设我们从一组 ID 中选择任意一对 ID。假设我们选择 13。然后 SELECT f((SELECT data FROM temp WHERE id = 1), (SELECT data FROM temp WHERE id = 3)); 返回 true。

5 没有出现在任何地方,因为 'green' 是唯一长度为 5 的字符串。如果我找回重复项就好了;我可以弄清楚如何清理它们。

真实情况详情

实际上,我的“第二列”是 PostGIS GEOMETRY(LINESTRING),我的“二元函数”是 ST_Equals。所以真的,我正在搜索一堆重复的行字符串。我觉得这些信息与手头的问题无关,只是表明我无法将问题简化为更易于处理的操作。

最佳答案

开始摆弄这个 SQL Fiddle

select
t1.id id1,
t1.data data1,
t2.id id2,
t2.data data2,
f(t1.data, t2.data) f
from
temp t1
inner join
temp t2 on t1.id < t2.id
order by t1.id, t2.id

然后转到最终版本SQL Fiddle

select array[id1] || array_agg(id2) id2
from (
select t1.id id1, t2.id id2
from
temp t1
inner join
temp t2 on t1.id < t2.id
where f(t1.data, t2.data)
) s
group by id1
order by id1, id2

关于postgresql - 在 PostgreSQL 中按二元运算符分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17374289/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com