Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Query по выборке натравленная на изменение значения поля  [new]
Victor Cookin
Member

Откуда: Самара
Сообщений: 779
господа сообщники!

Есть такая задача - не придумал как её решить:

select  
c.delete_flag, c.change_date, c.rms_central_id 
from central_rateplan_route_history c
where customer_id = 262 
and preffered_route_id = 8833
order by change_date



PSEUDO_DELETED_FLAG CHANGE_DATE RMS_CENTRAL_ID

12/7/2005 10:39:35 AM 1648
Y 7/21/2006 1:50:52 PM 1648
7/21/2006 1:57:32 PM
7/27/2006 12:55:20 PM 2017
Y 7/27/2006 4:05:56 PM
Y 8/2/2006 2:11:46 PM 2044
Y 8/2/2006 5:35:14 PM
8/10/2006 11:29:17 AM 2055
8/10/2006 3:52:09 PM
8/17/2006 12:53:34 PM 2074
8/17/2006 5:09:50 PM
Мне нужны только те записи, на которых меняет своё значение плюс самая первая запись.
В данном случае 1,2,3,5,8 : записи. Какую Query можно тут придумать?
2 апр 09, 19:56    [7014358]     Ответить | Цитировать Сообщить модератору
 Re: Query по выборке натравленная на изменение значения поля  [new]
A.K.
Member

Откуда: Пенза
Сообщений: 2571
Victor Cookin
Мне нужны только те записи, на которых меняет своё значение плюс самая первая запись.

На которых что меняет свое значение? Тест-кейс не совсем понятен, но предположу, что для поиска смены значений в упорядоченной выборке можно использовать аналитические функции LAG и LEAD.
2 апр 09, 20:00    [7014372]     Ответить | Цитировать Сообщить модератору
 Re: Query по выборке натравленная на изменение значения поля  [new]
Victor Cookin
Member

Откуда: Самара
Сообщений: 779
A.K.,

PSEUDO_DELETED_FLAG
2 апр 09, 20:02    [7014375]     Ответить | Цитировать Сообщить модератору
 Re: Query по выборке натравленная на изменение значения поля  [new]
dmidek
Member

Откуда: Киев - Дортмунд
Сообщений: 116208
Чуточку нечистый метод из за того, что Вы используете NULL- значения
и это немножко затрудняет сравнение , но в практических целях
подойдет. В качестве ХХХ надо выбрать значение, которое гарантированно
не может встретиться в исходном множестве

SQL> with tab1
  2  as
  3  (select 'y' flagg, sysdate dat
  4  from dual
  5  union all
  6  select 'y' flagg, sysdate +1
  7  from dual
  8  union all
  9  select null flagg, sysdate +3
 10  from dual
 11  union all
 12  select 'y' flagg, sysdate +4
 13  from dual
 14  union all
 15  select 'y' flagg, sysdate+5
 16  from dual
 17  )
 18  select flagg, dat
 19    from (select flagg,
 20                 dat,
 21                 NVL(flagg, 'XXX') flagg_nl,
 22                 NVL(lag(flagg) over(order by dat), 'XXX') lag_flagg_nl
 23            from tab1)
 24   where flagg_nl <> lag_flagg_nl
 25  /
 
FLAGG DAT
----- -----------
y     2.4.2009 18
      5.4.2009 18
y     6.4.2009 18
 
SQL> 
2 апр 09, 20:08    [7014400]     Ответить | Цитировать Сообщить модератору
 Re: Query по выборке натравленная на изменение значения поля  [new]
A.K.
Member

Откуда: Пенза
Сообщений: 2571
Imho, нужна небольшая поправка к предложенному решению:
 18  select flagg, dat
 19    from (select flagg,
 20                 dat,
 21                 NVL(flagg, 'XXX') flagg_nl,
 22                 NVL(lag(flagg, 1, 'YYY') over(order by dat), 'XXX') lag_flagg_nl
 23            from tab1)
 24   where flagg_nl <> lag_flagg_nl
 25  /
Иначе первая запись не войдет в выборку, если флаг в ней будет nullевым.
2 апр 09, 20:17    [7014426]     Ответить | Цитировать Сообщить модератору
 Re: Query по выборке натравленная на изменение значения поля  [new]
dmidek
Member

Откуда: Киев - Дортмунд
Сообщений: 116208
A.K.
Imho, нужна небольшая поправка к предложенному решению:
 18  select flagg, dat
 19    from (select flagg,
 20                 dat,
 21                 NVL(flagg, 'XXX') flagg_nl,
 22                 NVL(lag(flagg, 1, 'YYY') over(order by dat), 'XXX') lag_flagg_nl
 23            from tab1)
 24   where flagg_nl <> lag_flagg_nl
 25  /
Иначе первая запись не войдет в выборку, если флаг в ней будет nullевым.


Вы совершенно правы :-)
2 апр 09, 20:25    [7014450]     Ответить | Цитировать Сообщить модератору
 Re: Query по выборке натравленная на изменение значения поля  [new]
Victor Cookin
Member

Откуда: Самара
Сообщений: 779
dmidek, A.K., - большое спасибо, всё заработало:

   select delete_flag, change_date, customer_id, preffered_route_id
     from (select delete_flag, change_date, customer_id, preffered_route_id,                
                  delete_flag||preffered_route_id||customer_id flagg_nl,
                  lag(delete_flag||preffered_route_id||customer_id, 1, 'YYY') over (order by customer_id, preffered_route_id, change_date) lag_flagg_nl                                    
             from central_rateplan_route_history             
             )
    where flagg_nl <> lag_flagg_nl 

2 апр 09, 21:08    [7014522]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить