2017-06-05 61 views
1

我需要乘以2个数组中的每个元素并投影一个数组,其中每个元素是产品结果。2个数组中相同索引的元素的产品

例子:

select * from vetor_query; 

返回:

query_id |pesos                        | 
---------|----------------------------------------------------------------------------------------------------| 
1  |{2.0000,0.4150,2.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000} | 

和查询:

select * from vetor_documento; 

返回:

doc |pesos                        | 
-------|----------------------------------------------------------------------------------------------------| 
d1.txt |{3.0000,0.8301,4.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000} | 
d2.txt |{2.0000,0.0000,0.0000,0.0000,2.0000,2.0000,2.0000,2.0000,2.0000,0.0000,0.0000,0.0000,0.0000,0.0000} | 
d3.txt |{0.0000,1.0729,0.0000,0.0000,0.0000,0.0000,2.0000,1.0000,0.0000,2.0000,2.0000,0.0000,0.0000,0.0000} | 
d4.txt |{0.0000,1.0729,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,5.1699,4.0000,4.0000} | 

我需要结合两个查询(交叉连接),并生成内部产品的每个docquery_id的结果数组。

我第一次尝试这样一条:

select vq.query_id, vd.doc, unnest(vq.pesos) * unnest(vd.pesos) 
from vetor_query vq 
cross join vetor_documento vd; 

然而,它产生这样的错误:

Functions and operators can take at most one set argument

回答

0

可以使用unnest()功能的方便的功能并行UNNEST多个阵列。

做,在一个LATERAL加入,每乘结果行和饲料,为数组构造:

SELECT q.query_id, d.doc, qd.prod 
FROM vetor_query   q 
CROSS JOIN vetor_documento d 
CROSS JOIN LATERAL (
    SELECT ARRAY(SELECT x*y FROM unnest(q.pesos, d.pesos) t(x, y)) AS prod 
    ) qd; 

这是假设所有的数组的长度相同,否则多余的元素都充满了NULL。

相关:

所得数组中的顺序对应于元素的原始顺序。但考虑:

相关问题