找到'最早'的复合主键

时间:2011-08-09 08:53:34

标签: sql oracle

考虑以下数据:

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)。但是,这需要至少两个级别的子查询,因此,既尴尬又缓慢......那么,任何更好的想法?!谢谢:))

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

或其他什么。