查询根据时间戳将两个表合并为一个表

时间:2016-03-24 15:37:47

标签: postgresql

我在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行的原因。不应比较不同事件之间的数据。

1 个答案:

答案 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