我在Postgres有三张桌子。它们都是关于一个事件(一个事件,而不是“体育赛事”)。每个表都是关于活动期间的特定项目。
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 | 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
我希望最终输出为:
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
)。当然我也会在那里有标题信息,但这很简单。
我尝试使用我发布的查询使用不同的JOIN和UNION,但我似乎无法正确使用它。我发布的那个给出了我能管理的最好的结果,但它不完整。
旁注:每分钟都会有一个新的“事件”。因此gid对于每个事件都是唯一的,并且查询需要确保每个数据集与来自同一gid的数据配对。这是我的i1.gid = h.gid
行的原因。不应比较不同事件之间的数据。
答案 0 :(得分: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