2017-06-05 4 views
1

Je dois multiplier chaque élément de 2 tableaux et projeter une colonne qui est un tableau et chaque élément est le résultat du produit.Produit d'éléments avec le même index dans 2 tableaux

Exemple:

select * from vetor_query; 

Retours:

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} | 

Et la requête:

select * from vetor_documento; 

Retours:

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} | 

J'ai besoin de combiner les deux requêtes (jointure croisée) et de produire en conséquence tableau de produit interne pour chaque doc et query_id.

Ma première tentative était celle-ci:

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

Cependant, il donne cette erreur:

Functions and operators can take at most one set argument

Répondre

0

Vous pouvez utiliser la fonction pratique de la fonction unnest() à unnest plusieurs tableaux en parallèle.

faire dans un LATERAL rejoindre, multiplier par ligne résultante et les aliments dont un constructeur MATRICE:

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; 

Cela suppose tous les tableaux ont la même longueur, les autres éléments excédentaires sont remplis de NULL.

connexes:

L'ordre dans le tableau résultant correspond à l'ordre initial d'éléments. Mais considérez: