如何比较 Postgres 中相同 table 的两个数组行?
How to compare two array rows of same table in Postgres?
我有一个 table 如下所示:
empid dept
----- ----
1000 {acct,hr}
1005 {dev,hr}
其中 dept
是一个 文本数组 。
我的要求是比较 table 中的行,这样我就可以检查 dept
列是否有任何相等的值。例如,在上面的 table 它应该比较
1000 - {hr} 和 1005 - {hr} 将相似度输出为 1。
我怎样才能做到这一点?
我坚决主张使用 junction/association table 表示此类数据。通常,SQL 个查询可以得到更好的优化。
但是根据您的数据结构,您可以生成所有员工对,然后统计他们相同的部门。假设给定员工(如您的列表中)没有重复的部门:
with t as (
select v.*
from (values (1000, array['acct', 'hr']), (1005, array['dev', hr'])) v(empid, depts)
)
select t1.empid, t2.empid,
(select count(*)
from unnest(t1.depts) d1 join
unnest(t2.depts) d2
on d1 = d2
) cnt
from t t1 join
t t2
on t1.empid < t2.empid;
Here 是一个 db<>fiddle.
我有一个 table 如下所示:
empid dept
----- ----
1000 {acct,hr}
1005 {dev,hr}
其中 dept
是一个 文本数组 。
我的要求是比较 table 中的行,这样我就可以检查 dept
列是否有任何相等的值。例如,在上面的 table 它应该比较
1000 - {hr} 和 1005 - {hr} 将相似度输出为 1。
我怎样才能做到这一点?
我坚决主张使用 junction/association table 表示此类数据。通常,SQL 个查询可以得到更好的优化。
但是根据您的数据结构,您可以生成所有员工对,然后统计他们相同的部门。假设给定员工(如您的列表中)没有重复的部门:
with t as (
select v.*
from (values (1000, array['acct', 'hr']), (1005, array['dev', hr'])) v(empid, depts)
)
select t1.empid, t2.empid,
(select count(*)
from unnest(t1.depts) d1 join
unnest(t2.depts) d2
on d1 = d2
) cnt
from t t1 join
t t2
on t1.empid < t2.empid;
Here 是一个 db<>fiddle.