Full join с подзапросом

Snay
Дата: 08.03.2011 14:45:50
Требуется получить список людей, с 2 датами-id.
Если в подзапросе строк меньше, чем в основной таблице с фильтром - возвращается меньшее количество. Это вроде понятно.
Ищу возможные пути этого избежать, но пока не вижу.
SELECT 
S.LASTNAME, S.SURNAME, S.ID, S2.ID
FROM S FULL JOIN 
(SELECT S.LASTNAME, S.SURNAME, S.ID 
FROM S WHERE (S.ID Like ?)) S2
ON (S.LASTNAME=S2.LASTNAME AND S.SURNAME=S2.SURNAME)
WHERE (S.ID Like ?)
id = в виде даты (030311), т.е. не уникальный.
AmKad
Дата: 08.03.2011 14:53:59
Snay,

10142614
Snay
Дата: 08.03.2011 15:11:39
виноват.
with s as
(select IVANOV lastname, PETR name, KR030311 id from dual union all
 select PETROV lastname, SIDR name, KR030311 id from dual union all
 select SIDOROV lastname, IVAN name, KR030311 from dual union all
 select IVANOV lastname, PETR name, RL040311 id from dual union all
 select PETROV lastname, SIDR name, RL040311 id from dual union all
 )
select * from s

Результат:
lastname name id next_id
IVANOV PETR KR030311 RL040311
PETROV SIDR KR030311 RL040311
SIDOROV IVAN KR030311
-2-
Дата: 08.03.2011 15:18:21
Snay,

агг(case...)
AmKad
Дата: 08.03.2011 15:18:42
Snay,

with s as
(select 'IVANOV'  lastname, 'PETR' name, 'KR030311' id from dual union all
 select 'PETROV'  lastname, 'SIDR' name, 'KR030311' id from dual union all
 select 'SIDOROV' lastname, 'IVAN' name, 'KR030311' id from dual union all
 select 'IVANOV'  lastname, 'PETR' name, 'RL040311' id from dual union all
 select 'PETROV'  lastname, 'SIDR' name, 'RL040311' id from dual
 )
select lastname, name, max(decode(dr, 1, id)) id, max(decode(dr, 2, id)) next_id
from
   (select s.*, dense_rank () over (partition by lastname order by id) dr
    from s
   )
group by lastname, name
order by lastname, name;

LASTNAM NAME ID       NEXT_ID
------- ---- -------- --------
IVANOV  PETR KR030311 RL040311
PETROV  SIDR KR030311 RL040311
SIDOROV IVAN KR030311

AmKad
Дата: 08.03.2011 15:21:39
AmKad,

dense_rank () over (partition by lastname, name order by id)
Snay
Дата: 08.03.2011 17:42:11
Это замечательно, спасибо.

а с сортировкой можно что-ниудь сделать? ранги не всегда верны.
id dr
KR04122010 1
KR18102010 2
RK03122010 3
RK17102010 4
RK29122010 5

пытался делать
order by substr(id,3,2), substr(id,5,2)
- не помогло
Snay
Дата: 08.03.2011 17:56:21
-2-, можно чуть подробней? как предлагаете использовать case?
-2-
Дата: 08.03.2011 18:02:21
Snay,

Ты сначала попытайся задачу расписать на разные случаи. Под приведенный тобой результат можно подобрать несколько решений, которые дадут разный результат при вариации данных. А то, что набрано русскими буквами препинания вообще ни о чем.
Snay
Дата: 08.03.2011 18:22:05
with s as
(select IVANOV lastname, PETR name, KR030311 id from dual union all
 select PETROV lastname, SIDR name, KR030311 id from dual union all
 select SIDOROV lastname, IVAN name, KR030311 from dual union all
 select IVANOV lastname, PETR name, RL040311 id from dual union all
 select PETROV lastname, SIDR name, RL040311 id from dual union all
 select IVANOV lastname, PETR name, KR120211 id from dual union all
 select IVANOV lastname, PETR name, RL130211 id from dual union all
 select SIDOROV lastname, IVAN name, RL260311 from dual union all
 
 )
select * from s

например,
where id like 'KR030311%' and (next_id like 'RL040311%' OR next_id is null)
lastname name id next_id
IVANOV PETR KR030311 RL040311
PETROV SIDR KR030311 RL040311
SIDOROV IVAN KR030311