Нахождение «самого раннего» составного первичного ключа - PullRequest
1 голос
/ 09 августа 2011

Рассмотрим эти данные:

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 Ответ

2 голосов
/ 09 августа 2011

Это то, для чего были изобретены аналитические функции ! Вы хотите что-то вроде:

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

или что-то еще.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...