Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Как найти тольто то значение которое меняется? / 25 сообщений из 33, страница 1 из 2
31.07.2018, 09:37
    #39681407
Trika
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как найти тольто то значение которое меняется?
Доброго всем дня.

Возникла такая задача ни как не могу с ней справится. Уже гуглил и перереыл все возможный форумы.

Есть одна таблица. В ней столб со значениями Y и N. Нужно найти те Y-ки которые после них меняются на N.

select * from enginelogs t where t.flag like 'Y' order by t.timeday

Прошу вас помогите разобраться. Заранее примного благодарен.
...
Рейтинг: 0 / 0
31.07.2018, 09:44
    #39681410
-2-
-2-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как найти тольто то значение которое меняется?
TrikaперереылПопробуй искать не по Y и N, а по 1 и 0.
...
Рейтинг: 0 / 0
31.07.2018, 09:47
    #39681414
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как найти тольто то значение которое меняется?
STFF start_of_group
...
Рейтинг: 0 / 0
31.07.2018, 10:27
    #39681432
Trika
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как найти тольто то значение которое меняется?
select * from enginelogs t
order by t.timeday

Выводит такой результат:
timeday ---- flag ---- model
22.07.2018 ---- Y ---- rotter
21.07.2018 ---- Y ---- rotter
21.07.2018 ---- N ---- rotter
20.07.2018 ---- Y ---- rotter
20.07.2018 ---- Y ---- rotter
19.07.2018 ---- Y ---- rotter
18.07.2018 ---- Y ---- rotter
17.07.2018 ---- Y ---- rotter
16.07.2018 ---- N ---- rotter
15.07.2018 ---- Y ---- rotter
14.07.2018 ---- Y ---- rotter
13.07.2018 ---- N ---- rotter
12.07.2018 ---- Y ---- rotter
12.07.2018 ---- Y ---- rotter



мне нужны тольто те Y что идут после N тоесь:
timeday ---- flag ---- model
20.07.2018 ---- Y ---- rotter
15.07.2018 ---- Y ---- rotter
14.07.2018 ---- Y ---- rotter
12.07.2018 ---- Y ---- rotter
...
Рейтинг: 0 / 0
31.07.2018, 10:35
    #39681436
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как найти тольто то значение которое меняется?
...
Рейтинг: 0 / 0
31.07.2018, 10:43
    #39681441
MaximaXXL
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как найти тольто то значение которое меняется?
Trika select * from enginelogs t
order by t.timeday

Выводит такой результат:
timeday ---- flag ---- model
22.07.2018 ---- Y ---- rotter
21.07.2018 ---- Y ---- rotter
21.07.2018 ---- N ---- rotter
20.07.2018 ---- Y ---- rotter
20.07.2018 ---- Y ---- rotter
19.07.2018 ---- Y ---- rotter
18.07.2018 ---- Y ---- rotter
17.07.2018 ---- Y ---- rotter
16.07.2018 ---- N ---- rotter
15.07.2018 ---- Y ---- rotter
14.07.2018 ---- Y ---- rotter
13.07.2018 ---- N ---- rotter
12.07.2018 ---- Y ---- rotter
12.07.2018 ---- Y ---- rotter



мне нужны тольто те Y что идут после N тоесь:
timeday ---- flag ---- model
20.07.2018 ---- Y ---- rotter
15.07.2018 ---- Y ---- rotter
14.07.2018 ---- Y ---- rotter
12.07.2018 ---- Y ---- rotter


А по какому полю Вы сортируете для получения (ожидания) таких результатов?
...
Рейтинг: 0 / 0
31.07.2018, 10:45
    #39681443
MaximaXXL
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как найти тольто то значение которое меняется?
Trika,

т.е. по какому полю понятно, но почему именно такие ... какое условие (хотябы на словах) должно Вам выдать ожидаемый результат?
...
Рейтинг: 0 / 0
31.07.2018, 11:28
    #39681468
Trika
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как найти тольто то значение которое меняется?
timeday ---- flag ---- model
22.07.2018 ---- Y ---- rotter
21.07.2018 ---- Y ---- rotter
21.07.2018 ---- N ---- rotter
20.07.2018 ---- Y ---- rotter
20.07.2018 ---- Y ---- rotter
19.07.2018 ---- Y ---- rotter
18.07.2018 ---- Y ---- rotter
17.07.2018 ---- Y ---- rotter
16.07.2018 ---- N ---- rotter
15.07.2018 ---- Y ---- rotter
14.07.2018 ---- Y ---- rotter
13.07.2018 ---- N ---- rotter
12.07.2018 ---- Y ---- rotter
12.07.2018 ---- Y ---- rotter




прошу прощения последний тот что желтым по ошибке вписал. Как видете те Y что идут после N выделены красным должны выводится в результате
...
Рейтинг: 0 / 0
31.07.2018, 11:30
    #39681471
Trika
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как найти тольто то значение которое меняется?
мне нужны тольто те Y что идут после N тоесь:
timeday ---- flag ---- model
20.07.2018 ---- Y ---- rotter
15.07.2018 ---- Y ---- rotter
14.07.2018 ---- Y ---- rotter
12.07.2018 ---- Y ---- rotter

это был пример ожидаемого результата, условия я так и не смог придумать
...
Рейтинг: 0 / 0
31.07.2018, 11:47
    #39681482
Trika
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как найти тольто то значение которое меняется?
ну или сделать так чтобы он переберал эту таблицу:

timeday ---- flag ---- model
22.07.2018 ---- Y ---- rotter
21.07.2018 ---- Y ---- rotter
21.07.2018 ---- N ---- rotter
20.07.2018 ---- Y ---- rotter
20.07.2018 ---- Y ---- rotter
19.07.2018 ---- Y ---- rotter
18.07.2018 ---- Y ---- rotter
17.07.2018 ---- Y ---- rotter
16.07.2018 ---- N ---- rotter
15.07.2018 ---- Y ---- rotter
14.07.2018 ---- Y ---- rotter
13.07.2018 ---- N ---- rotter
12.07.2018 ---- Y ---- rotter
12.07.2018 ---- Y ---- rotter

находил и выводил красные строки (те что идут после N)
...
Рейтинг: 0 / 0
31.07.2018, 11:50
    #39681484
MaximaXXL
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как найти тольто то значение которое меняется?
Trikaмне нужны тольто те Y что идут после N тоесь:
timeday ---- flag ---- model
20.07.2018 ---- Y ---- rotter
15.07.2018 ---- Y ---- rotter
14.07.2018 ---- Y ---- rotter
12.07.2018 ---- Y ---- rotter

это был пример ожидаемого результата, условия я так и не смог придумать

1. Уж не знаю где Вас учили но 20.07 идет ДО 21.07 (меня так учили)
2. 14.07 - я вообще не понял под какое условие попало
3. при наличии 2 записей за 21.07 то что они будут расположенны таким образом может решить только время в датах или случай
21.07.2018 ---- Y ---- rotter
21.07.2018 ---- N ---- rotter
20.07.2018 ---- Y ---- rotter
4. lead/lag Вам в помощь
...
Рейтинг: 0 / 0
31.07.2018, 11:53
    #39681485
Anton_Demin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как найти тольто то значение которое меняется?
может lag/lead поможет

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
with t as (select 1 xid, 0 xval from dual union
select 2 xid, 0 xval from dual union
select 3 xid, 1 xval from dual union
select 4 xid, 1 xval from dual union
select 5 xid, 1 xval from dual union
select 6 xid, 0 xval from dual union
select 7 xid, 0 xval from dual union
select 8 xid, 1 xval from dual)
select xid,
       xval,
       nvl(lag(xval) over(order by xid), xval) lag_val,
       case when xval != nvl(lag(xval) over(order by xid), xval) then 'change val' else 'same val' end
  from t
...
Рейтинг: 0 / 0
31.07.2018, 12:06
    #39681500
MaximaXXL
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как найти тольто то значение которое меняется?
Anton_Demin,

Вы этой конструкцией
Код: plsql
1.
nvl(lag(xval) over(order by xid), xval)


намекаете на то что не знаете параметров lag?
Код: plsql
1.
lag(xval,1,xval) over(order by xid)



или есть другой тайный смысл (например испаскудить null данные) ?
...
Рейтинг: 0 / 0
31.07.2018, 12:24
    #39681515
Anton_Demin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как найти тольто то значение которое меняется?
MaximaXXL,

век живи, век учись, спасибо)))
...
Рейтинг: 0 / 0
31.07.2018, 14:26
    #39681578
Trika
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как найти тольто то значение которое меняется?
все равно ничего не понятно. Если вас не затруднит обьясните новичку
...
Рейтинг: 0 / 0
31.07.2018, 14:43
    #39681590
merch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как найти тольто то значение которое меняется?
Trikaничего не понятно
вообще ничего?
...
Рейтинг: 0 / 0
31.07.2018, 14:44
    #39681592
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как найти тольто то значение которое меняется?
Trikaвсе равно ничего не понятно.Ну ссылки-то ты хоть нажимать умеешь?
...
Рейтинг: 0 / 0
31.07.2018, 15:15
    #39681614
Trika
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как найти тольто то значение которое меняется?
""спасибо за ответы вы помогли примерами""
...
Рейтинг: 0 / 0
31.07.2018, 15:46
    #39681632
Lary Denis
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как найти тольто то значение которое меняется?
Trika,

У нас на продакшн работает уже много лет код. Советую.

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
with t as 
  ( select 1 xid,  'Y' xval from dual union
    select 7 xid,  'N' xval from dual union
    select 13 xid, 'N' xval from dual union
    select 14 xid, 'Y' xval from dual union
    select 15 xid, 'N' xval from dual union
    select 28 xid, 'Y' xval from dual union
    select 29 xid, 'N' xval from dual union
    select 30 xid, 'Y' xval from dual
)
select distinct xid, xval from
(
select  
  tt.*,
  instr(lg, 'YN', 1, level) inst
from 
(
select 
  xid, 
  xval,
  listagg(xval, '') within group (order by xid) over() lg,
  rownum rn
from t
) tt
connect by level <= regexp_count(lg, 'YN')
)
where rn = inst
order by 1;
...
Рейтинг: 0 / 0
31.07.2018, 15:52
    #39681636
AmKad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как найти тольто то значение которое меняется?
Lary Denis,

Это хорошо, что у тебя в продакшене все помещается в varchar2. А то ведь и в clob с помощью xmlagg + replace собрать можно.
...
Рейтинг: 0 / 0
31.07.2018, 16:02
    #39681644
Trika
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как найти тольто то значение которое меняется?
Lary Denis,

Спасибо сейчас попробую
...
Рейтинг: 0 / 0
31.07.2018, 16:15
    #39681652
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как найти тольто то значение которое меняется?
Lary DenisУ нас на продакшн работает уже много лет код. Советую.


Это-же надо столько наворотить вместо элементарного LEAD/LAG.

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
with t as
  ( select 1 xid,  'Y' xval from dual union
    select 7 xid,  'N' xval from dual union
    select 13 xid, 'N' xval from dual union
    select 14 xid, 'Y' xval from dual union
    select 15 xid, 'N' xval from dual union
    select 28 xid, 'Y' xval from dual union
    select 29 xid, 'N' xval from dual union
    select 30 xid, 'Y' xval from dual
),
x as (
      select  t.*,
              lead(xval,1,xval) over(order by xid) next_xval
        from  t
     )
select  xid,
        xval
  from  x
  where xval = 'Y'
    and next_xval = 'N'
  order by xid
/

       XID X
---------- -
         1 Y
        14 Y
        28 Y

SQL> 



А в 12C:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
with t as
  ( select 1 xid,  'Y' xval from dual union
    select 7 xid,  'N' xval from dual union
    select 13 xid, 'N' xval from dual union
    select 14 xid, 'Y' xval from dual union
    select 15 xid, 'N' xval from dual union
    select 28 xid, 'Y' xval from dual union
    select 29 xid, 'N' xval from dual union
    select 30 xid, 'Y' xval from dual
)
select  xid,
        xval
  from  t
  match_recognize(
                  order by xid
                  measures y.xid as xid,
                           y.xval as xval
                  pattern(
                          y n
                         )
                  define y as xval = 'Y',
                         n as xval = 'N'
                 )
/

       XID X
---------- -
         1 Y
        14 Y
        28 Y

SQL> 
...
Рейтинг: 0 / 0
31.07.2018, 16:45
    #39681664
MaximaXXL
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как найти тольто то значение которое меняется?
Lary DenisTrika,

У нас на продакшн работает уже много лет код. Советую.

...


А я НЕ советую (то что у Lary Denis маленький справочник, еще не повод советовать/использовать странный код)
На банальной таблице в 40к строк, он мрет:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
with t as 
  ( select level xid,  decode(mod(level,2),1,'Y','N') xval from dual connect by level < 40000
)
select distinct xid, xval from
(
select  
  tt.*,
  instr(lg, 'YN', 1, level) inst
from 
(
select 
  xid, 
  xval,
  listagg(xval, '') within group (order by xid) over() lg,
  rownum rn
from t
) tt
connect by level <= regexp_count(lg, 'YN')
)
where rn = inst
order by 1;

ORA-01489: result of string concatenation is too long



В то время как lag/lead превосходно справляется
...
Рейтинг: 0 / 0
31.07.2018, 17:44
    #39681699
AmKad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как найти тольто то значение которое меняется?
MaximaXXL
Код: plsql
1.
ORA-01489: result of string concatenation is too long



В то время как lag/lead превосходно справляется
А ну-ка Lary Denis, увеличь свой *enis и покажи нам свое решение через xmlagg + clob.
...
Рейтинг: 0 / 0
31.07.2018, 21:11
    #39681764
Trika
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как найти тольто то значение которое меняется?
MaximaXXL,

Вариант Lary Denis-а не проканал. Все еще дергаю ваш но ни как не могу профиксить пока читаю доки спасибо вам за помощь. На сегодня замотался завтра отпишусь.
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Как найти тольто то значение которое меняется? / 25 сообщений из 33, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]