考虑以下数据:
ID Year Code1 Code2
-------- -------- -------- --------
ABC123 99/00 10010 A1121
ABC123 00/01 10010 A1131
ABC123 01/02 10010 A1141
XYZ567 06/07 12501 B2213
XYZ567 07/08 12501 B2223
这四个字段组成了主键,我需要找到每个ID
实例的最早出现,以及其他三个键。所以,在这种情况下,我想要:
ID Year Code1 Code2
-------- -------- -------- --------
ABC123 99/00 10010 A1121
XYZ567 06/07 12501 B2213
在Oracle中,我目前的解决方案是聚合Code2
的第四个字符,即年份索引,并返回最小值,然后重新组合密钥(即变化的Year
部分);然而,这显然是模棱两可的,可能不能一对一地映射。 (此外,这种方法很慢!)排序不起作用,因为一般情况下,ID
下会有多个值,Year
不包括世纪。
我在想,也许我可以为每个ID
做一个子查询,然后进行排序并选择第一个项目(即ROWNUM=1
)。但是,这需要至少两个级别的子查询,因此,既尴尬又缓慢......那么,任何更好的想法?!谢谢:))
答案 0 :(得分:2)
这就是analytic functions的发明!你想要这样的东西:
select id, year, code1, code2 from
( select id, year, code1, code2,
row_number() over (partition by id order by ???) as rn
from mytable
)
where rn = 1
我把order by
留给了???因为我不完全明白你想要什么。它可能是:
order by year, code1, code2
或
order by substr(code2,4,1), year
或其他什么。