如何从ODI

时间:2017-10-13 08:37:57

标签: sql oracle oracle-data-integrator

我的表结构:

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作为复合ID,我需要提取每个复合键的最新行。 假设对于这个组合,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中的代码,所以我只能选择像group by等简单的sql函数。 感谢

2 个答案:

答案 0 :(得分:1)

我相信ODI支持窗口函数......

你的连接语法很糟糕,真的很糟糕,就像,再也不会做坏事。使用显式连接(不是你在这里需要它们)

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

答案 1 :(得分:1)

如果您有多个具有相同最大值的行,则使用ROW_NUMBER将不会返回与查询相同的值。您可以改为使用RANKDENSE_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