1

我有 2 张桌子。

1. Table events: event_date, name, event
2. Table locations: loc_date, name, location

我需要从表事件中获取所有行,并从loc_date 最后在 event_date 之前的表位置获取位置。

更新我需要从表events中为每一行获取一个位置。例如:

events
event_date | name | event
13:53      | test1| 0
14:20      | test2| 1
18:00      | test3| 5

locations
location_date | name | location
13:20         | a    | Moscow
13:40         | b    | New-York
14:00         | c    | London
17:24         | d    | Tokio
18:00         | e    | Berlin

我想要的结果是:

event_date | name  | event | location
13:53      | test1 | 0     | New-York
14:20      | test2 | 1     | London
18:00      | test3 | 5     | Berlin

我试过这样的事情:

select e.*
from events e
left join locations l on l.loc_date < e.event_date

但是此查询返回许多行,其中包含来自事件的相同数据和来自位置的不同数据。

4

2 回答 2

0

Prolly 是这样的:

select e.* from events e
inner join location l on l.loc_date < e.event_date

但这不是一个好的模式,您应该有一些东西可以正确链接两个表。

于 2012-06-20T08:49:53.917 回答
0

您可以为此使用分析函数 first_value()

select distinct e.event_date, e.name, e.event,
    first_value(l.location)
        over (partition by e.event_date, e.name, e.event
            order by l.loc_date desc) as location
from events e
left join locations l on l.loc_date < e.event_date
order by e.event_date, e.name, e.event;

EVENT NAME       EVENT LOCATION
----- ----- ---------- --------
13:53 test1          0 New-York
14:20 test2          1 London
18:00 test3          5 Tokio

请注意,该test3位置是东京,而不是您预期结果中的柏林;那是因为您指定了 'loc_date last before event_date',而 Berlinloc_dateevent_date. 如果您确实希望它与之匹配,则需要使用<=而不是<.

执行此操作的非分析方法是使用相关子查询,该子查询必须命中表两次;我更喜欢分析方法,但这可能更容易理解:

select e.event_date, e.name, e.event, l.location
from events e
join locations l on l.loc_date = (
    select max(loc_date) from locations
    where loc_date < e.event_date
)
order by e.event_date, e.name, e.event;
于 2012-06-20T10:50:31.850 回答