2017-11-06 15 views
0

Ich habe eine Matrix mit mehreren Zeilen/Spalten. Die Anzahl der Spalten ist immer gleich der Anzahl der Zeilen, aber ich kenne die genaue Anzahl nicht, da sie das Ergebnis einer anderen Abfrage sind.So finden Sie die Umkehrung einer Matrix in SQL Server

Hier ist ein einfaches Beispiel mit zwei Spalten/Zeilen

 ID1 ID2 
1  4 7 
2  2 6 

Ich erhalte diese Matrix aus einer Tabelle, die wie folgt aussieht:

ID1 ID2 Value 
1 1 4 
1 2 7 
2 1 2 
2 2 6 

Jetzt würde ich die Inverse davon haben möchte Matrix.

Das Ergebnis, wie dies in einer Matrix aussehen:

ID1 ID2 
1 0.6 -0.7 
2 -0.2 0.4 

Oder wie dies in einer Tabelle:

ID1 ID2 Value 
1 1 0.6 
1 2 -0.7 
2 1 -0.2 
2 2 0.4 

Es ist im Grunde die Excel-Formel = {MINVERSE (Array)} in SQL Server

In meiner Datenbank habe ich beide, Tabelle und Matrix, so dass ich verwenden kann, was am besten funktionieren würde, um das Gegenteil zu finden.

+1

Ich denke, dies zu tun in SQL ist eine schlechte Idee. Speichern Sie es in einer Datenbank scheint vernünftig mit dem Schema, das Sie haben, aber versuchen, es in einem RDBMS zu manipulieren ... es ist eine Strecke, da Sie Beziehungen wie in den Daten selbst definiert berücksichtigen. Es scheint zweckmäßiger, dies außerhalb der Datenbank in einem Programm zu tun, das für den Umgang mit Matrixdaten ausgelegt ist. – JNevill

+0

@JNevill Was denken Sie, Sie sind die richtige Software, um große Matrix wie diese (200X200) zu behandeln? Die Arbeit, die ich damit mache, ist im Grunde Finanz-Engineering, Risiko-Rendite-Berechnung. – Rich

+0

Ich bin mir nicht sicher, da ich nicht oft mit Matrixdaten arbeite. Ich würde mir eine Sprache vorstellen, die mehr auf Analysen und Statistiken wie R ausgerichtet ist, wäre aber ein guter Ausgangspunkt. [Dieses Tutorial] (http://www.r-tutor.com/r-introduction/matrix) scheint darauf hinzuweisen, dass R gut passt. – JNevill

Antwort

0

Hier ist eine Implementierung für eine 2x2-Matrix. Es ist hässlich, weil eine Matrix keine Beziehung in dem Sinne ist, dass ein RDBMS relational ist. Aber vielleicht wird es dir nah genug kommen.

SELECT 
    CASE WHEN id1=id2 THEN CASE WHEN id1=1 THEN 2 ELSE 1 END ELSE ID1 END as ID2, 
    CASE WHEN id1=id2 THEN CASE WHEN id2=1 THEN 2 ELSE 1 END ELSE ID2 END as ID2, 
    CASE WHEN id1<>id2 THEN -1 ELSE 1 END * matrix.value/(determinate1.value-determinate2.value) as inverse_value 
FROM 
    (SELECT EXP(SUM(LOG(value))) as value FRom matrix where id1=id2) as determinate1, 
    (SELECT EXP(SUM(LOG(value))) as value FROM matrix WHERE id1<>id2) as determinate2, 
    matrix; 

Hier ist es in sqlfiddle

Verwandte Themen