2017-06-05 4 views
1

Ich muss jedes Element von 2 Arrays multiplizieren und eine Spalte projizieren, die ein Array ist und jedes Element ist das Produktergebnis.Produkt von Elementen mit gleichem Index in 2 Arrays

Beispiel:

select * from vetor_query; 

Returns:

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

Und die Abfrage:

select * from vetor_documento; 

Returns:

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

Ich muss beide Abfragen kombinieren (Kreuz Join) und als Ergebnis Array von internen Produkt für jede doc und query_id produzieren.

Mein erster Versuch dieser war:

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

Allerdings ergibt es diesen Fehler:

Functions and operators can take at most one set argument

Antwort

0

Sie können die praktische Funktion der unnest() Funktion verwenden, um mehrere Arrays parallel UNNEST.

, dass Sie in ein LATERAL verbinden, multiplizieren pro resultierende Zeile und Futtermittel, die auf ein Array-Konstruktor:

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; 

Dies wird alle Arrays die gleiche Länge vorausgesetzt, sonst Überschuss Elemente mit NULL gefüllt sind.

Related:

Die Reihenfolge, in der resultierenden Anordnung entspricht die ursprüngliche Reihenfolge der Elemente. Aber bedenken Sie:

Verwandte Themen