2016-03-24 29 views
1

私はPostgresに3つのテーブルを持っています。それらはすべて単一のイベント(「スポーツイベント」ではなく、オカレンス)に関するものです。各テーブルは、イベント中の特定のアイテムに関するものです。タイムスタンプに基づいて2つのテーブルを1つに結合するクエリ

table_header columns 
    gid, start_timestamp, end_timestamp, location, positions 

    table_item1 columns 
    gid, side, visibility, item1_timestamp 

    table_item2 columns 
    gid, position_id, name, item2_timestamp 

私は、次のクエリを試してみた:

SELECT h.gid, h.location, h.start_timestamp, h.end_timestamp, i1.side, 
     i1.visibility, i2.position_id, i2.name, i2.item2_timestamp AS timestamp 
    FROM tablet_header AS h 
    LEFT OUTER JOIN table_item1 i1 on (i1.gid = h.gid) 
    LEFT OUTER JOIN table_item2 i2 on (i2.gid = i1.gid AND 
     i1.item1_timestamp = i2.item2_timestamp) 
    WHERE h.start_timestamp BETWEEN '2016-03-24 12:00:00'::timestamp AND now()::timestamp 

問題がitem1_timestampとitem2_timestampが一致しないとき、私は列からいくつかのデータを失うことだということです。

私はtable_item1とtable_item2に持っているのであれば:タイムスタンプ(およびgid)に純粋に基づいて、

gid | timestamp | side | name 
----------------------------- 
1 | 17:00:00 | left | charlie 
1 | 17:00:03 |  | frank 
1 | 17:00:05 | right | 
1 | 17:00:06 |  | dee 
1 | 17:00:10 | left | 

gid | item1_timestamp | side   gid | item2_timestamp | name 
----------------------------  ----------------------------------- 
1 | 17:00:00  | left   1 | 17:00:00  | charlie 
1 | 17:00:05  | right   1 | 17:00:03  | frank 
1 | 17:00:10  | left   1 | 17:00:06  | dee 

私は最終的な出力になりたいです。当然私はそこにヘッダー情報も持っていますが、それは簡単です。

私は別のJOINとUNIONを使用して投稿したクエリで遊んでみましたが、正しくできないようです。私が投稿したものは、私が管理できる最良の結果をもたらしますが、それは不完全です。

サイドノート:1分ごとに新しい「イベント」があります。したがって、gidは各イベントに固有のものになり、クエリでは、各データセットが同じgidのデータとペア設定されていることを確認する必要があります。これは私のi1.gid = h.gid行の理由です。異なるイベント間のデータは比較しないでください。

答えて

0
select t1.gid, t1.timestamp, t1.side, t2.name 
from t1 
left join t2 on t2.timestamp=t1.timestamp and t2.gid=t1.gid 
union 
select t1.gid, t1.timestamp, t1.side, t2.name 
from t2 
left join t1 on t2.timestamp=t1.timestamp and t2.gid=t1.gid 
+0

ありがとうございました。これは近いですが、列が順序どおりでなく、表1のタイムスタンプと一致しない表2の列がすべて欠落しています。 – Chris

+0

列の順序が間違っているとはどういう意味ですか? union(vs union all)は重複行を防ぎます。 –

+0

2つのテーブルを出力と独立して比較すると、個々のデータが一列に並んでいません。私のOPで私のサンプル出力を使用するには、(左から順に)左から左に表示されます。問題の内容が完全にわからない。 – Chris

関連する問題