Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Помогите с запросом, обращение к строке  [new]
Тетрис
Guest
Есть:
with t as (
select sysdate-2 dt,1 mod_type, 'Ivanov' lname from dual union all
select sysdate-1 dt,1 mod_type, 'Petrov' lname from dual union all
select sysdate dt, null, 'Sidorov' lname from dual )

select * from t


Необходимо соорудить результат изменения фамилий клиентов:
with result as (
select 'Sidorov' old_lname,'Petrov' new_lname  from dual union all
select 'Petrov' old_lname,'Ivanov' new_lname  from dual )

select * from result


я пытаюсь сделать через connect by и row_number(), но как то без успешно

Заранее спасибо
30 ноя 13, 21:28    [15218469]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом, обращение к строке  [new]
Пакмэн
Guest
with t as (
select sysdate-2 dt,1 mod_type, 'Ivanov' lname from dual union all
select sysdate-1 dt,1 mod_type, 'Petrov' lname from dual union all
select sysdate dt, null, 'Sidorov' lname from dual )
select t2.*,
       last_value(lname) over(order by dt desc range between current row and NumToDSInterval(1, 'day') following) new_name
  from (select * from t order by mod_type nulls first) t2
30 ноя 13, 22:21    [15218613]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом, обращение к строке  [new]
Тетрис
Guest
Пакмэн,

with t as (
--первый чел
select 123 clnt_id, sysdate-2 dt,1 mod_type, 'Ivanov' lname from dual union all
select 123,sysdate-1 dt,1 mod_type, 'Petrov' lname from dual union all
select 123, sysdate dt, null, 'Sidorov' lname from dual union all
--второй чел
select 456 clnt_id, sysdate-90 dt,1 mod_type, 'Shmelnikova' lname from dual union all
select 456, sysdate dt, null, 'Kirilovna' lname from dual


)

select * from t;


with result as (
--первый чел
select 'Sidorov' old_lname,'Petrov' new_lname  from dual union all
select 'Petrov' old_lname,'Ivanov' new_lname  from dual union all
--второй чел
select 'Kirilovna' old_lname,'Shmelnikova' new_lname  from dual --union all
)
select * from result;


Некорректно работает, изменение фамилии может быть как полгода назад так и год назад и нужно учитывать каждого клиент который решил сменить фамилию и дать головную боль для решение этой задачи.

Заранее спасибо
1 дек 13, 01:52    [15219499]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом, обращение к строке  [new]
lag()
Guest
Тетрис,

with t as (
--первый чел
select 123 clnt_id, sysdate-2 dt,1 mod_type, 'Ivanov' lname from dual union all
select 123,sysdate-1 dt,1 mod_type, 'Petrov' lname from dual union all
select 123, sysdate dt, null, 'Sidorov' lname from dual union all
--второй чел
select 456 clnt_id, sysdate-90 dt,1 mod_type, 'Shmelnikova' lname from dual union all
select 456, sysdate dt, null, 'Kirilovna' lname from dual
)

select * from
(
select 
lag(lname) over (partition by clnt_id order by dt, mod_type nulls last) old_lname, 
t.lname new_lname 
from t
order by clnt_id, dt
) where  old_lname is not null
1 дек 13, 10:42    [15219822]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить