1

私は2つのテーブルを持っています。

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

テーブルのイベントからすべての行を取得し、 event_date の前に loc_date が最後にあったテーブルの場所から場所を取得する必要があります。

更新テーブルeventsから行ごとに 1 つの場所を取得する必要があります。例えば:

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

これには分析関数 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'を指定したためであり、ベルリンのloc_dateものはevent_date. その上で一致させたい場合は、<=代わりにを使用する必要があります<

これを行う非分析的な方法は、テーブルを 2 回ヒットする必要がある相関サブクエリを使用することです。私は分析的な方法を好みますが、これは従うのが簡単かもしれません:

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 に答える
0

次のようなプロリー:

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

しかし、これは良いスキーマではありません。両方のテーブルを適切にリンクする何かが必要です。

于 2012-06-20T08:49:53.917 に答える