我的表结构:
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函数。 感谢
答案 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
将不会返回与查询相同的值。您可以改为使用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