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

Откуда:
Сообщений: 3022
Есть таблица BM_SERVICE_STATUS с такими данными:
SERVICE_STATUS_IDSERVICE_IDSTATUS_IDDATE_BEGDATE_END
69220825303115.03.2019 08:45:14
69219125303-115.03.2019 04:03:4315.03.2019 08:45:14
69214625303-115.03.2019 00:04:0615.03.2019 04:03:43
69153025303112.03.2019 00:19:4915.03.2019 00:04:06
69151525303-112.03.2019 00:04:1812.03.2019 00:19:49
69021025303106.03.2019 12:29:5312.03.2019 00:04:18

Здесь строка 692191 некорректная, образовалась из-за сбоя в работе информационной системы.
Информационная система такие ситуации (два одинаковых статуса подряд) не предусматривает и работает некорректно.
Мне нужно найти все подобные строки, а затем их объединить.

Таким запросом я получаю список записей, у которых есть сосед-дубль:
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; то есть не строку, у которой есть сосед-дубль, а обе связанные строки.
И не соображу, как это сделать.
15 мар 19, 10:06    [21833343]     Ответить | Цитировать Сообщить модератору
 Re: Как в исторической таблице определить два одинаковых атрибата подряд?  [new]
123йй
Member

Откуда:
Сообщений: 1514
Alibek B.,

lag/lead
15 мар 19, 10:14    [21833349]     Ответить | Цитировать Сообщить модератору
 Re: Как в исторической таблице определить два одинаковых атрибата подряд?  [new]
Alibek B.
Member

Откуда:
Сообщений: 3022
А пример можно?
Эти функции принципиально от self-join не отличаются, указанное для них выражение будет срабатывать только для одной из пары строк.
15 мар 19, 10:19    [21833365]     Ответить | Цитировать Сообщить модератору
 Re: Как в исторической таблице определить два одинаковых атрибата подряд?  [new]
Stax
Member

Откуда: Ukraine,Lviv
Сообщений: 1786
Alibek B.,

  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
15 мар 19, 10:46    [21833396]     Ответить | Цитировать Сообщить модератору
 Re: Как в исторической таблице определить два одинаковых атрибата подряд?  [new]
Anton_Demin
Member

Откуда: Ставрополь
Сообщений: 262
Alibek B.,

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
15 мар 19, 10:57    [21833411]     Ответить | Цитировать Сообщить модератору
 Re: Как в исторической таблице определить два одинаковых атрибата подряд?  [new]
Stax
Member

Откуда: Ukraine,Lviv
Сообщений: 1786
Alibek B.,

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

....
stax
15 мар 19, 11:07    [21833422]     Ответить | Цитировать Сообщить модератору
 Re: Как в исторической таблице определить два одинаковых атрибата подряд?  [new]
mama.said
Member

Откуда:
Сообщений: 63
Alibek B.,

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")) 
)
15 мар 19, 11:57    [21833525]     Ответить | Цитировать Сообщить модератору
 Re: Как в исторической таблице определить два одинаковых атрибата подряд?  [new]
Alibek B.
Member

Откуда:
Сообщений: 3022
Stax
подозреваю что Вам надо Упростить SQL запрос

Да, я тоже подумал, что это похоже на объединение диапазонов.
15 мар 19, 12:07    [21833543]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить