2016-09-14 2 views
0

Ich habe eine PostgreSQL-Tabelle, die Attribute über verschiedene physikalische Objekte speichert. Es hat die folgenden Felder:Erstellen Sie eine breite Sicht auf eine Datenbanktabelle in PostgreSQL

object_name 
attr_name (string e.g. attr_1, attr_2 etc.) 
attr_value (number) 
date_modified (date) 
priority (integer) 

Es können viele verschiedene Werte für den gleichen attr_name sein, die zu verschiedenen Zeitpunkten und mit unterschiedlichen Prioritätsstufe hinzugefügt werden (die die Genauigkeit der Quelle), so brauche ich diese Struktur für die Rückverfolgbarkeit später.

Ich möchte eine Ansicht dieser Tabelle erstellen, so dass ich es auf eine effiziente Weise für mehrere (~ 100) Attribute z.

SELECT * FROM View1 WHERE attr_1 = 5 and attr_2 > 3 etc. 

Also, um dies zu tun, ich glaube, ich brauche eine Ansicht mit Feldern wie:

object_name 
attr_1 
attr_2 
etc. 

Jedes Attribut attr_x die höchste Priorität Version des Attributs aus der ursprünglichen Tabelle enthalten soll. Weiß jemand, wie man das macht? Ich kenne nur sehr grundlegendes SQL, also weiß ich nicht einmal, wie das heißt oder ob es möglich ist. Hat jemand das schon mal in irgendeiner SQL-Datenbank gemacht? Ich möchte vermeiden, wenn möglich zwei getrennte Tabellen zu haben. Glücklich, jede andere Lösung zu akzeptieren, die sowohl die Rückverfolgbarkeit als auch die schnellen Abfrageanforderungen erfüllt.

+0

Beispieldaten und gewünschte Ergebnisse würden einen guten Job erklären, was Sie brauchen –

Antwort

0

Hier ist ein Beispiel-Abfrage, die alle Werte mit der höchsten Priorität in dem Format zurückgibt, die Sie wollen:

SELECT 
    object_name, 
    (SELECT attr_value AS attr_1 
    FROM t 
    WHERE t.object_name=t1.object_name AND attr_name='attr_1' 
    ORDER BY priority DESC LIMIT 1), 
    (SELECT attr_value AS attr_2 
    FROM t 
    WHERE t.object_name=t1.object_name AND attr_name='attr_2' 
    ORDER BY priority DESC LIMIT 1) 
FROM (SELECT DISTINCT object_name FROM t) t1; 

Ich nahm an, dass die Tabelle t genannt wird. Die Abfrage gibt 2 attr_??? Spalten zurück. Wenn Sie mehr haben, müssen Sie weitere Unterabfragen hinzufügen, eine für jede Spalte. Wenn Sie das nicht mögen (zB weil Sie eine große Anzahl von haben), können wir etwas tun, das keine große Abfrage benötigt, aber es gibt die Ergebnisse als JSON-Objekte zurück (also in einem anderen Format)).

Wenn Sie eine Ansicht erstellen möchten, führen Sie einfach die folgenden:

CREATE VIEW myview AS SELECT ... 
         ^^^ insert the query from above 

Wenn Sie diese so schnell wie möglich sein, ich würde empfehlen, 2 Tabellen: eine für die höchste Priorität Werte und ein für alles andere.

+0

Das ist großartig, vielen Dank! Ich kann die Abfrage in Python basierend auf der Liste der Attribute erstellen, die ich bereits habe, also kein Problem. Danke für den Tipp zur Geschwindigkeit - ich werde sehen, wie schnell es ist mit einem und erstellen Sie eine neue Tabelle mit hoher Priorität, wenn nötig. – vahndi

Verwandte Themen