2016-09-14 9 views
0

私は、異なる物理オブジェクトに関する属性を格納するPostgreSQLテーブルを持っています。これは、以下のフィールドを有する:PostgreSQLでデータベーステーブルのワイドビューを作成

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

あり、異なる日に、異なる優先順位レベル(ソースの精度を表す)を添加する同じattr_name、のために多くの異なる値であるので、私はこのような構造を必要とするかもしれませんトレーサビリティのために後で。

このテーブルのビューを作成して、複数の(〜100)属性に対して効率的にクエリを実行できるようにしたいと考えています。

object_name 
attr_1 
attr_2 
etc. 

各属性attr_xは、元のテーブルから属性の最も高い優先度のバージョンが含まれている必要があります

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

だから、これを行うために、私は私のようなフィールドを持つビューが必要だと思います。誰もこれを行う方法を知っていますか?私は非常に基本的なSQLを知っているだけなので、これが何で呼ばれているのか、それが可能なのか分からない。誰もこれまでに、SQL型のデータベースでこれをしたことがありますか?可能であれば、2つの別々のテーブルを持つことを避けたいと思います。トレーサビリティと高速クエリーの両方の要件を満たす他のソリューションを受け入れることを喜んでします。

+0

サンプルデータと望みの結果は、あなたが必要としていることを説明する良い仕事をするでしょう –

答えて

0

ここであなたが望む形式で最も高い優先度を持つすべての値を返すクエリの例です:

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; 

私はテーブルがtと呼ばれているものとは。クエリは2 attr_???の列を返します。それ以上のものがある場合は、列ごとに1つずつサブクエリを追加する必要があります。あなたが好きではない場合は(例えば、attr_nameの数が多いため)、巨大なクエリを書く必要はありませんが、結果はJSONオブジェクトとして返されます(したがって、別の形式になります)。

ビューを作成したい場合は、単に実行し、次の優先順位が最も高い値のための1と1:あなたは、これは可能な限り速くする必要がある場合は

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

、私は2つのテーブルを使用することをお勧めします他のすべてのために。

+0

それはすごく、ありがとう!私はPythonですでに問題のない属性のリストに基づいてクエリを生成できます。スピードに関するヒントをありがとう - 私はそれがいかに速いかを見て、必要ならば新しい優先度の高いテーブルを作成します。 – vahndi

関連する問題