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

Откуда:
Сообщений: 84
Добрый день!
Подскажите, как получить список изменений.
Например, есть таблица значение|дата
В ней значения :
1|t1
2|t2
2|t3
1|t4
4|t5
2|t6
4|t7
5|t8

Запрос должен вывести:1,2,1,4,2,4,5
2 ноя 17, 18:18    [20922746]     Ответить | Цитировать Сообщить модератору
 Re: Список изменений.  [new]
Elic
Member

Откуда: 1984. Выбраковка финно-угром началась. КЯЗ
Сообщений: 27696
STFF start_of_group
2 ноя 17, 18:22    [20922760]     Ответить | Цитировать Сообщить модератору
 Re: Список изменений.  [new]
Stax
Member

Откуда: Ukraine,Lviv
Сообщений: 772
iv_roman_vl,

  1  with t(z,d) as (
  2  select 1,'t1' from dual union all
  3  select 2,'t2' from dual union all
  4  select 2,'t3' from dual union all
  5  select 1,'t4' from dual union all
  6  select 4,'t5' from dual union all
  7  select 2,'t6' from dual union all
  8  select 4,'t7' from dual union all
  9  select 5,'t8' from dual )
 10  ,tt as (
 11  select
 12    t.*
 13   ,lag(z,1,-z) over (order by d) la
 14  from t
 15  )
 16* select z,d from tt where z<>la order by d
SQL> /

         Z D
---------- --
         1 t1
         2 t2
         1 t4
         4 t5
         2 t6
         4 t7
         5 t8

7 rows selected.


....
stax
2 ноя 17, 18:53    [20922843]     Ответить | Цитировать Сообщить модератору
 Re: Список изменений.  [new]
iv_roman_vl
Member

Откуда:
Сообщений: 84
Stax,

Спасибо!!! Работает.
А вот если столбец не числовой, а строчный?
3 ноя 17, 09:07    [20923753]     Ответить | Цитировать Сообщить модератору
 Re: Список изменений.  [new]
env
Member

Откуда: Россия, Москва
Сообщений: 5721
iv_roman_vl,

Который из них? И что мешает проверить?
3 ноя 17, 09:21    [20923779]     Ответить | Цитировать Сообщить модератору
 Re: Список изменений.  [new]
Stax
Member

Откуда: Ukraine,Lviv
Сообщений: 772
Stax,
  1  with t(z,d) as (
  2    select 'a','t1' from dual union all
  3    select 'b','t2' from dual union all
  4    select 'b','t3' from dual union all
  5    select 'b','t4' from dual union all
  6    select 'c','t5' from dual union all
  7    select 'a','t6' from dual union all
  8    select 'a','t7' from dual union all
  9    select 'b','t8' from dual )
 10    ,tt as (
 11    select
 12      t.*
 13     ,lag(z,1,z||'*') over (order by d) la
 14    from t
 15    )
 16* select z,d from tt where z<>la order by d
SQL> /

Z D
- --
a t1
b t2
c t5
a t6
b t8


......
stax
3 ноя 17, 09:48    [20923840]     Ответить | Цитировать Сообщить модератору
 Re: Список изменений.  [new]
iv_roman_vl
Member

Откуда:
Сообщений: 84
env,

первый столбец
3 ноя 17, 09:48    [20923841]     Ответить | Цитировать Сообщить модератору
 Re: Список изменений.  [new]
iv_roman_vl
Member

Откуда:
Сообщений: 84
Stax,

Отлично!!! Спасибо!!!
И ,надеюсь, последний вопрос)
Если в первой строке встречается null, то запрос не верны. Возвращает не правильно.
3 ноя 17, 09:59    [20923867]     Ответить | Цитировать Сообщить модератору
 Re: Список изменений.  [new]
Stax
Member

Откуда: Ukraine,Lviv
Сообщений: 772
iv_roman_vl,

не тестировал

  1  with t(z,d) as (
  2    select '','t1' from dual union all
  3    select '','t2' from dual union all
  4    select 'c','t3' from dual union all
  5    select '','t4' from dual union all
  6    select 'c','t5' from dual union all
  7    select 'a','t6' from dual union all
  8    select 'a','t7' from dual union all
  9    select '','t8' from dual )
 10    ,tt as (
 11    select
 12      t.*
 13     ,lag(z,1,z||'*') over (order by d) la
 14    from t
 15    )
 16  select z,d
 17   from tt
 18* where (z is not null and z<>nvl(la,z||'*')) or (z is null and la is not null) order by d
SQL> /

Z D
- --
  t1
c t3
  t4
c t5
a t6
  t8

6 rows selected.


ps
если известно недопустимое значение (напр ~) то проще
nvl(z,'~') ...

.....
stax
3 ноя 17, 10:37    [20924003]     Ответить | Цитировать Сообщить модератору
 Re: Список изменений.  [new]
iv_roman_vl
Member

Откуда:
Сообщений: 84
Stax,

Спасибо, огромное. А то не было времени разбираться в тонкостях with и lag.
Спасибо!!!
3 ноя 17, 10:44    [20924032]     Ответить | Цитировать Сообщить модератору
 Re: Список изменений.  [new]
xtender
Member

Откуда: Мск
Сообщений: 4782
+ match_recognize для 12c
with t(z,d) as (
select 1,'t1' from dual union all
select 2,'t2' from dual union all
select 2,'t3' from dual union all
select 1,'t4' from dual union all
select 4,'t5' from dual union all
select 2,'t6' from dual union all
select 4,'t7' from dual union all
select 5,'t8' from dual 
)
select 
 z,d_start,nvl(d_end,d_start) d_end
from t
MATCH_RECOGNIZE (
  order by d
  MEASURES
    STRT.z as z
   ,STRT.d as d_start
   ,last(same.d) as d_end
  pattern (strt same*)
  define
     same as same.z = prev(same.z)
)
3 ноя 17, 10:51    [20924063]     Ответить | Цитировать Сообщить модератору
 Re: Список изменений.  [new]
Stax
Member

Откуда: Ukraine,Lviv
Сообщений: 772
xtender,

null?

....
stax
3 ноя 17, 12:08    [20924382]     Ответить | Цитировать Сообщить модератору
 Re: Список изменений.  [new]
xtender
Member

Откуда: Мск
Сообщений: 4782
Stax,

Null? И что с ним не так?
3 ноя 17, 12:31    [20924485]     Ответить | Цитировать Сообщить модератору
 Re: Список изменений.  [new]
iv_roman_vl
Member

Откуда:
Сообщений: 84
Stax,

А есть какието ограничения на такой запрос?
При with (select ...)
ко всей таблице около 100 000 строк смещение между следующим и предыдущим элементом нарушается.
Толи размер влияет, толи от значений текущего или следующего элемента . Непонятно.
3 ноя 17, 12:39    [20924517]     Ответить | Цитировать Сообщить модератору
 Re: Список изменений.  [new]
xtender
Member

Откуда: Мск
Сообщений: 4782
а, понял вроде, NULL'ы надо сворачивать тоже?
+ тогда и их сравнивать будем
select 
 z,d_start,nvl(d_end,d_start) d_end
from t
MATCH_RECOGNIZE (
  order by d
  MEASURES
    STRT.z as z
   ,STRT.d as d_start
   ,last(same.d) as d_end
  pattern (strt same*)
  define
     same as decode(same.z,prev(same.z),1)=1
)
3 ноя 17, 12:41    [20924529]     Ответить | Цитировать Сообщить модератору
 Re: Список изменений.  [new]
Stax
Member

Откуда: Ukraine,Lviv
Сообщений: 772
iv_roman_vl,
про with не понял

Как вывести разные значения для одинаковых значений столбцов.

SQL> select * from t order by d;

Z          D
---------- ----------
null       t1
null       t2
c          t3
null       t4
c          t5
a          t6
a          t7
null       t8

8 rows selected.

SQL> ed
Wrote file afiedt.buf

  1  with
  2    tt as (
  3    select
  4      t.*
  5     ,lag(z,1,z||'*') over (order by d) la
  6    from t --Ваша таблічка на 100 000
  7    )
  8  select z,d
  9   from tt
 10* where (z is not null and z<>nvl(la,z||'*')) or (z is null and la is not null) order by d
SQL> /

Z          D
---------- ----------
null       t1
c          t3
null       t4
c          t5
a          t6
null       t8

6 rows selected.


сбиватся не должно(если я не напартичил с null)

мож у Вас сортировка (т1) более сложная, или надо партицировать

смотрите в какой момент "сбивается"

.....
stax
3 ноя 17, 12:52    [20924575]     Ответить | Цитировать Сообщить модератору
 Re: Список изменений.  [new]
Stax
Member

Откуда: Ukraine,Lviv
Сообщений: 772
xtender,

спасибо

как ето у меня decode из головы вылетело,
начал городить ...
старею

.....
stax
3 ноя 17, 12:54    [20924583]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить