ODI

2017-10-13 4 views
1

私のテーブル構造にデータセットから最新の行を選択する方法:私は、複合IDとしてID1 + ID2 + ID3を検討していますODI

ID1 ID2 ID3 Value Last_Update_date 
10 11 12 0.1 21-SEP-17 01.46.12.623580000 PM 
10 11 12 0.2 20-SEP-17 01.46.12.623580000 PM 
10 11 12 0.3 19-SEP-17 01.46.12.623580000 PM 
20 21 22 0.4 01-SEP-17 01.46.12.623580000 PM 
20 21 22 0.5 12-SEP-17 01.46.12.623580000 PM 
20 21 22 0.4 21-SEP-17 01.46.12.623580000 PM 

と私はそれぞれの複合キーの最新の行を抽出する必要があります。 ID1、ID2、ID3 - > 10,11,12の組み合わせで10,11,12 0.2(20 sepが最新のもの)を返すと仮定します。

私は以下のコードを試してみました:

SELECT a.ID1 , 
     a.ID2, 
     a.ID3 , 
     a.value , 
     a.Last_update_date 
FROM a, 
     (SELECT ID1, 
       ID2, 
       ID3, 
       MAX(last_update_date) last_update_date 
     FROM a 
     GROUP BY ID1, 
       ID2, 
       ID3 
     ) b 
WHERE a.ID1    = b.ID1 
AND  a.ID2    = b.ID2 
AND  a.ID3    = a.ID3 
AND  a.last_update_date = b.last_update_date 

はこれを書くための任意のより良い方法はあります。 ODIでコードを使用するので、グループなどの単純なSQL関数のみのオプションがあります。 おかげ

答えて

1

私はODIは、ウィンドウ関数をサポートしています信じて...

そして、あなたの結合構文のような、悪い本当に悪いですが、それが再び悪い決してしません。 (あなたがすべてではここではそれらを必要としないこと)あなたは同じ最大値を持つ複数の行を持っている場合にはクエリと同じ値を返しませんROW_NUMBERを使用して

select x.* 
from 
(
select a.*, 
     row_number() over(partition by id1, id2, id3 order by last_update_date desc) rn 
from a 
) x 
where rn = 1 
+0

ああ、私は私のプロジェクトのためにそれを実行されています。ありがとう –

+0

'ROW_NUMBER()'は同じ結果を与えません - 単一の行だけを返します。 OPのクエリは、すべて同じ最大値を持つ場合、複数の行を返します。 – MT0

1

明示的な結合を使用。代わりにRANKまたはDENSE_RANKを使用することができます。

SELECT ID1, 
     ID2, 
     ID3, 
     value 
     Last_update_date 
FROM (
    SELECT ID1, 
     ID2, 
     ID3, 
     value, 
     last_update_date 
     RANK() OVER (PARTITION BY id1, id2, id3 ORDER BY last_update_date DESC) 
      AS rnk 
    FROM a 
) 
WHERE rnk = 1 

をしかし、分析関数を使用して、クエリの直接対応は次のとおりです。

SELECT ID1, 
     ID2, 
     ID3, 
     value 
     Last_update_date 
FROM (
    SELECT ID1, 
     ID2, 
     ID3, 
     value, 
     last_update_date 
     MAX(last_update_date) OVER (PARTITION BY id1, id2, id3) 
      AS max_last_update_date 
    FROM a 
) 
WHERE last_update_date = max_last_update_date 
関連する問題