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

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

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

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

Прошу вас помогите разобраться. Заранее примного благодарен.
...
Рейтинг: 0 / 0
Как найти тольто то значение которое меняется?
    #39681410
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TrikaперереылПопробуй искать не по Y и N, а по 1 и 0.
...
Рейтинг: 0 / 0
Как найти тольто то значение которое меняется?
    #39681414
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
STFF start_of_group
...
Рейтинг: 0 / 0
Как найти тольто то значение которое меняется?
    #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
Как найти тольто то значение которое меняется?
    #39681436
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Как найти тольто то значение которое меняется?
    #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
Как найти тольто то значение которое меняется?
    #39681443
MaximaXXL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Trika,

т.е. по какому полю понятно, но почему именно такие ... какое условие (хотябы на словах) должно Вам выдать ожидаемый результат?
...
Рейтинг: 0 / 0
Как найти тольто то значение которое меняется?
    #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
Как найти тольто то значение которое меняется?
    #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
Как найти тольто то значение которое меняется?
    #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
Как найти тольто то значение которое меняется?
    #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
Как найти тольто то значение которое меняется?
    #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
Как найти тольто то значение которое меняется?
    #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
Как найти тольто то значение которое меняется?
    #39681515
Фотография Anton_Demin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MaximaXXL,

век живи, век учись, спасибо)))
...
Рейтинг: 0 / 0
Как найти тольто то значение которое меняется?
    #39681578
Trika
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
все равно ничего не понятно. Если вас не затруднит обьясните новичку
...
Рейтинг: 0 / 0
Как найти тольто то значение которое меняется?
    #39681590
merch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Trikaничего не понятно
вообще ничего?
...
Рейтинг: 0 / 0
Как найти тольто то значение которое меняется?
    #39681592
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Trikaвсе равно ничего не понятно.Ну ссылки-то ты хоть нажимать умеешь?
...
Рейтинг: 0 / 0
Как найти тольто то значение которое меняется?
    #39681614
Trika
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
""спасибо за ответы вы помогли примерами""
...
Рейтинг: 0 / 0
Как найти тольто то значение которое меняется?
    #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
Как найти тольто то значение которое меняется?
    #39681636
Фотография AmKad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lary Denis,

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

Спасибо сейчас попробую
...
Рейтинг: 0 / 0
Как найти тольто то значение которое меняется?
    #39681652
Фотография 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
Как найти тольто то значение которое меняется?
    #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
Как найти тольто то значение которое меняется?
    #39681699
Фотография AmKad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MaximaXXL
Код: plsql
1.
ORA-01489: result of string concatenation is too long



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

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


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