powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Как в исторической таблице определить два одинаковых атрибата подряд?
8 сообщений из 8, страница 1 из 1
Как в исторической таблице определить два одинаковых атрибата подряд?
    #39786449
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть таблица BM_SERVICE_STATUS с такими данными:
SERVICE_STATUS_IDSERVICE_IDSTATUS_IDDATE_BEGDATE_END69220825303115.03.2019 08:45:1469219125303-115.03.2019 04:03:4315.03.2019 08:45:1469214625303-115.03.2019 00:04:0615.03.2019 04:03:4369153025303112.03.2019 00:19:4915.03.2019 00:04:0669151525303-112.03.2019 00:04:1812.03.2019 00:19:4969021025303106.03.2019 12:29:5312.03.2019 00:04:18
Здесь строка 692191 некорректная, образовалась из-за сбоя в работе информационной системы.
Информационная система такие ситуации (два одинаковых статуса подряд) не предусматривает и работает некорректно.
Мне нужно найти все подобные строки, а затем их объединить.

Таким запросом я получаю список записей, у которых есть сосед-дубль:
Код: plsql
1.
2.
3.
4.
select *
from bm_service_status ss
join bm_service_status sd on (sd.service_id = ss.service_id and sd.status_id = ss.status_id and sd.date_beg = ss.date_end)
order by ss.date_beg desc


Такой запрос для тестовых данных возвращает строку 692146.
А я бы хотел получить строки 692146 и 692191; то есть не строку, у которой есть сосед-дубль, а обе связанные строки.
И не соображу, как это сделать.
...
Рейтинг: 0 / 0
Как в исторической таблице определить два одинаковых атрибата подряд?
    #39786453
123йй
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alibek B.,

lag/lead
...
Рейтинг: 0 / 0
Как в исторической таблице определить два одинаковых атрибата подряд?
    #39786463
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А пример можно?
Эти функции принципиально от self-join не отличаются, указанное для них выражение будет срабатывать только для одной из пары строк.
...
Рейтинг: 0 / 0
Как в исторической таблице определить два одинаковых атрибата подряд?
    #39786476
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alibek B.,

Код: 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.
  1  with r as
  2   (select to_date('2015-01-01', 'yyyy-mm-dd') res_date, +1 rate   from dual union all
  3    select to_date('2015-01-02', 'yyyy-mm-dd') res_date, -1 rate   from dual  union all
  4    select to_date('2015-01-03', 'yyyy-mm-dd') res_date, -1 rate  from dual union  all
  5    select to_date('2015-01-04', 'yyyy-mm-dd') res_date, +1 rate from dual union all
  6    select to_date('2015-01-05', 'yyyy-mm-dd') res_date, +1 rate from dual union all
  7    select to_date('2015-01-06', 'yyyy-mm-dd') res_date, -1 rate from dual union all
  8    select to_date('2015-01-07', 'yyyy-mm-dd') res_date, +1 rate  from dual union all
  9    select to_date('2015-01-08', 'yyyy-mm-dd') res_date, -1 rate from dual union all
 10    select to_date('2015-01-09', 'yyyy-mm-dd') res_date, +1 rate  from dual)
 11  , rr  as (
 12  select r.*
 13  ,lag(rate,1,-rate) over (order by res_date) l
 14  ,lead(rate,1,-rate) over (order by res_date) e
 15  from r)
 16* select * from rr where rate=l or rate=e
SQL> /

RES_DATE        RATE           L           E
-------- ----------- ----------- -----------
02.01.15      -1.000       1.000      -1.000
03.01.15      -1.000      -1.000       1.000
04.01.15       1.000      -1.000       1.000
05.01.15       1.000       1.000      -1.000



....
stax
...
Рейтинг: 0 / 0
Как в исторической таблице определить два одинаковых атрибата подряд?
    #39786486
Фотография Anton_Demin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alibek B.,

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
with tbl as
        ( select 101 id, 0 status  from dual union
          select 102 id, 1 status  from dual union
          select 103 id, 1 status  from dual union
          select 104 id, 0 status  from dual union
          select 105 id, 1 status  from dual union
          select 106 id, 0 status  from dual union
          select 107 id, 1 status  from dual union
          select 108 id, 0 status  from dual union
          select 109 id, 0 status  from dual union
          select 110 id, 1 status  from dual union
          select 111 id, 0 status  from dual)
select id,status          
from(select  id, 
             status, 
             lag (status,1,-10500) over (order by id) prev_status,  
             lead(status,1,-10500) over (order by id) next_status  
      from tbl order by id)
where status = prev_status or status = next_status
...
Рейтинг: 0 / 0
Как в исторической таблице определить два одинаковых атрибата подряд?
    #39786492
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alibek B.,

подозреваю что Вам надо Упростить SQL запрос

....
stax
...
Рейтинг: 0 / 0
Как в исторической таблице определить два одинаковых атрибата подряд?
    #39786545
mama.said
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Alibek B.,

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
with bm_service_status as (
  select 692208 service_status_id, 25303 service_id, 1 status_id, to_date('15.03.2019 08:45:14', 'dd.mm.yyyy hh24:mi:ss') date_beg, null date_end from dual union all    
  select 692191,   25303,   -1,    to_date('15.03.2019 04:03:43', 'dd.mm.yyyy hh24:mi:ss'),  to_date('15.03.2019 08:45:14', 'dd.mm.yyyy hh24:mi:ss') from dual union all
  select 692146,   25303,   -1,    to_date('15.03.2019 00:04:06', 'dd.mm.yyyy hh24:mi:ss'),  to_date('15.03.2019 04:03:43', 'dd.mm.yyyy hh24:mi:ss') from dual union all
  select 691530,   25303,    1,    to_date('12.03.2019 00:19:49', 'dd.mm.yyyy hh24:mi:ss'),  to_date('15.03.2019 00:04:06', 'dd.mm.yyyy hh24:mi:ss') from dual union all
  select 691515,   25303,   -1,    to_date('12.03.2019 00:04:18', 'dd.mm.yyyy hh24:mi:ss'),  to_date('12.03.2019 00:19:49', 'dd.mm.yyyy hh24:mi:ss') from dual union all
  select 690210,   25303,    1,    to_date('06.03.2019 12:29:53', 'dd.mm.yyyy hh24:mi:ss'),  to_date('12.03.2019 00:04:18', 'dd.mm.yyyy hh24:mi:ss') from dual 
)
select * 
from bm_service_status
where service_status_id in (
  select service_status_id from (  
    select ss.service_status_id "id1", sd.service_status_id "id2" 
    from bm_service_status ss
    join bm_service_status sd on (sd.service_id = ss.service_id and sd.status_id = ss.status_id and sd.date_beg = ss.date_end)
    order by ss.date_beg desc
  )
  unpivot(service_status_id for ids in ("id1", "id2")) 
)
...
Рейтинг: 0 / 0
Как в исторической таблице определить два одинаковых атрибата подряд?
    #39786556
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Staxподозреваю что Вам надо Упростить SQL запрос
Да, я тоже подумал, что это похоже на объединение диапазонов.
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Как в исторической таблице определить два одинаковых атрибата подряд?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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