2017-03-06 5 views
0

私は2テーブルの顧客&プロファイルに参加しています。どちらの表も特定の列cust_idで結合されています。プロフィールテーブルには、1つ以上のエントリーがあります。私は、両方のテーブルを結合するときに、start_ts(列)によって最新のエントリを選択したいと思います。結果として、私は顧客からの1行の行と、結果セットのプロファイルからの最も最近の行を希望します。このオラクルSQLを行う方法はありますか? (すべてのDBエンジンのために働く)最も最近のレコードを結合の一部として取得します

答えて

3

私は希望ウィンドウ関数を使用します。

select . . . 
from customer c join 
    (select p.*, 
      row_number() over (partition by cust_id order by start_ts desc) as seqnum 
     from profile 
    ) p 
    on c.cust_id = p.cust_id and p.seqnum = 1; 

あなたが同様のプロファイルを持っていない顧客を取得したい場合は、left joinを使用することができます。 @juergen

select 
    c.*, 
    p.* 
from 
    customer c inner join 
    profile p on p.cust_id = c.cust_id and not exists(
     select * 
     from profile 
     where cust_id = c.cust_id and start_ts > p.start_ts 
    ) 
+1

@PunterVicky - あなたがOracleで働く場合、複数の参加を使用する他の人に対してGordonのソリューションをテストすることもできます。 Gordonのソリューションは、はるかに効率的(より速く)になるかもしれません。分析機能はかなり標準的ですが、あなたがOracleのために大金を支払う理由は、他のSQLデータベース製品では得られない余計なものです。分析関数は、クエリで時間のかかる結合の数を減らすという特定の目的で導入されました。 – mathguy

+0

ありがとう@Gordon&mathguy。私もこれを試してみましょう! –

2

一つの方法は、あなたがデータをフィルタリングするためのデータを選択し、profileの特定の最大レコードに対して参加したいテーブルを結合することである

select c.*, p.* 
from customer c 
join profile p on c.cust_id = p.cust_id 
join 
(
    select cust_id, max(start_ts) as maxts 
    from profile 
    group by cust_id 
) p2 on p.cust_id = p2.cust_id and p.start_ts = p2.maxts 
+0

ありがとう:ここ –

+0

"すべてのDBエンジンで動作する"というのは良いことかもしれませんが、悪いことかもしれません。オラクル製品に大きな支出を費やした場合、すべてのDBエンジンで必ずしも利用可能ではないOracle機能を活用することもできます。この場合、分析関数は繰り返し結合より高速なソリューションを提供する可能性があります。 – mathguy

+0

私は同意します....... –

1

は(そして何より新しいエントリが存在しない場合、それは最新です)もう一つの方法です。私はこれを試してみる。
+0

ありがとう@maraca !! –

関連する問題