2

Oracle8i内でそれらをリンクするためのキーを持たない2つのテーブルを接続したい状況があります。表Aにいくつかの情報と日時があり、表Bにいくつかの情報と日時があります。私が欲しいのは、表Aのすべてと、表Aの時間の表Bの対応するデータです。以下でモックアップします。

Table A                     |   Table B
John   31/07/2012 10:50:32  |   Travel to Library   31/07/2012 10:48:23
John   31/07/2012 10:55:49  |   Arrive at Library   31/07/2012 11:02:34
John   31/07/2012 11:00:15  |   Reading Book        31/07/2012 11:07:11
John   31/07/2012 11:05:23  |
John   31/07/2012 11:10:12  |

私が作成したいのはこれです:

John   31/07/2012 10:50:32   Travel to Library   
John   31/07/2012 10:55:49   Travel to Library       
John   31/07/2012 11:00:15   Travel to Library            
John   31/07/2012 11:05:23   Arrive at Library
John   31/07/2012 11:10:12   Reading Book

疑われるかもしれませんが、これは、5分ごとに受信するGPSデータを含むテーブルと、アクティビティを一覧表示するまったく関係のない別のテーブルに関連しています。これまでの私の最も近い試みは、2つの部分でクエリを作成することでした。最初の部分は、アクティビティを調べてアクティビティの日付と次のアクティビティの日付を返し、関係者の名前に基づいて2つのテーブルを接続し、GPSデータを返します。 2つのアクティビティの日付の間にある場合は、GPSの日付と次のGPSの日付を逆にして、それらの間にある場合はアクティビティを返します。どちらの方法でも、いずれかのデータセットのすべてが返されるわけではありません。

私の主な誤動作は、日付時刻の前後を取得するためのリープ/ラグ関数の使用にあると感じています。おそらく私は明白な答えを見落としているだけです。

私は本当にこれで正しい方向に私を向けるためにいくつかの助けを使うことができました。

4

2 に答える 2

2

あなたは本当に古い8iを使用しています。ただし、8.1.6以降を使用している場合は、LEAD()分析関数を使用して目的の結果を得ることができます。あなたは実際のテーブル構造を提供しなかったので、私はそれらを次のようにモックアップしました:

create table A (name varchar2(10), dt date);           
create table B (event varchar2(20), dt date);   

これらの列テーブルがあれば、このクエリは機能します。

select a.name, a.dt, b.event
from a 
     , ( select b.* 
         , lead (b.dt, 1, null) over
              (order by dt asc) as next_dt
        from b ) b
where a.dt >= b.dt
and ( a.dt < b.next_dt or b.next_dt is null)

SQL Fiddleは11gR2を使用しますが、この構文は8iでも機能するはずです。

注意:分析機能は、9iR1(9.0.1.3など)のポイントリリースまでEnterprise Editionでのみライセンス供与され、そのような優れた機能に悩まされている場合に限ります。

于 2012-09-03T15:42:47.440 に答える
1

これを試して:

select Name, Time, Activity from
(
    select
        a.Name, a.Time, b.Activity,
        row_number() over (partition by a.Time order by b.time desc) as rn
    from TableA a, TableB b
    where a.time >= b.time and a.Name = b.Name
)
where rn = 1;

注:GPSデータにも表に名前が付いていると思います。

于 2012-09-03T14:13:20.197 に答える