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

Откуда:
Сообщений: 307
А как бы вы быстро нашли ошибки в архивной таблице, где могут быть заполнены периоды занимаемой должности с пересечением?
Например, человек был на разных должностях в такой последовательности

1 уборщик 1.01.2017 10.01.2017
2 ст.уборщик 11.01.2017 25.01.2017
3 гл.уборщик 22.01.2017 01.02.2017


когда он стал главным уборщиком, ему ошибочно поставили 22.01.2017, а надо было 26.01.2017
и таких ошибок может быть много.

Хочется сделать проверку одним запросом.
4 фев 19, 12:49    [21801195]     Ответить | Цитировать Сообщить модератору
 Re: Найти ошибки пересечения периодов а архиве  [new]
Stax
Member

Откуда: Ukraine,Lviv
Сообщений: 1712
cptngrb,
в табличке должен быть и ТН человечка
или Вы ищете ошибки для конкретного работника?

в чем у Вас проблема, перебором сравниваете не пересекается ли

зы
даж кажись ф-ция в оракле была

.....
stax
4 фев 19, 13:04    [21801207]     Ответить | Цитировать Сообщить модератору
 Re: Найти ошибки пересечения периодов а архиве  [new]
Stax
Member

Откуда: Ukraine,Lviv
Сообщений: 1712
cptngrb
А как бы вы быстро нашли ошибки в архивной таблице, где могут быть заполнены периоды занимаемой должности с пересечением?
Например, человек был на разных должностях в такой последовательности

1 уборщик 1.01.2017 10.01.2017
2 ст.уборщик 11.01.2017 25.01.2017
3 гл.уборщик 22.01.2017 01.02.2017


когда он стал главным уборщиком, ему ошибочно поставили 22.01.2017, а надо было 26.01.2017
и таких ошибок может быть много.

Хочется сделать проверку одним запросом.

напр для
1 уборщик 1.01.2017 10.01.2019
2 ст.уборщик 11.01.2017 25.01.2017
3 гл.уборщик 22.01.2017 01.02.2017

что надо получить, в какой форме?

ps
в самом простом случае ф-ция lag/lead

.....
stax
4 фев 19, 13:13    [21801221]     Ответить | Цитировать Сообщить модератору
 Re: Найти ошибки пересечения периодов а архиве  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 17182
with t(pos_id, emp_id, emp_position, fd, td) as (select 1, 1,	'уборщик', date'2017-01-01', date'2017-01-10'
from dual union all select 75, 1, 'ст.уборщик', date'2017-01-11', date'2017-01-25'
from dual union all select 8654, 1, 'гл.уборщик', date'2017-01-22', date'2017-02-01'
from dual
)
, solution1 as (
  select t1.pos_id, t1.emp_position, t1.fd, t1.td 
    from t t1, t t2
   where t1.emp_id = t2.emp_id
     and t1.fd < t2.td
     and t1.td > t2.fd
     and t1.pos_id <> t2.pos_id
)
, solution2 as (
  select pos_id, emp_position, fd, td, i_flag 
    from (
    select pos_id, emp_position, fd, td
         , case when fd < max(td) over(partition by emp_id order by fd rows between unbounded preceding and 1 preceding) then 'intersect with prior'
                when td > min(fd) over(partition by emp_id order by td rows between 1 following and unbounded following) then 'intersect with following'
            end i_flag
    from t
  ) where i_flag is not null
)
select * from 
solution1
--solution2
4 фев 19, 13:26    [21801232]     Ответить | Цитировать Сообщить модератору
 Re: Найти ошибки пересечения периодов а архиве  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 47267

cptngrb
когда он стал главным уборщиком, ему ошибочно поставили 22.01.2017, а надо было 26.01.2017
и таких ошибок может быть много.

А почему Вы решили, что это ошибки? Человек действительно может одновременно занимать две
и более должностей.

Posted via ActualForum NNTP Server 1.5

4 фев 19, 13:31    [21801237]     Ответить | Цитировать Сообщить модератору
 Re: Найти ошибки пересечения периодов а архиве  [new]
Stax
Member

Откуда: Ukraine,Lviv
Сообщений: 1712
Dimitry Sibiryakov,

даже если не может на нескольких одновременно, то неправильмым может оказатся и 25.01.2017

зы
если стоит задача помаленько навести лад в бардаке,
то имхо часто достаточно lag/lead,
а дальше бухи рученьками принимают решение как правильно

....
stax
4 фев 19, 13:37    [21801241]     Ответить | Цитировать Сообщить модератору
 Re: Найти ошибки пересечения периодов а архиве  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 47267

Stax
неправильмым может оказатся и 25.01.2017

Вот и я как бы намекаю, что надо не пересечения периодов искать, а несоответствия с
таблицей приказов о назначении/снятии.

Posted via ActualForum NNTP Server 1.5

4 фев 19, 13:51    [21801259]     Ответить | Цитировать Сообщить модератору
 Re: Найти ошибки пересечения периодов а архиве  [new]
cptngrb
Member

Откуда:
Сообщений: 307
это частный случай, в котором это является ошибкой
4 фев 19, 14:30    [21801308]     Ответить | Цитировать Сообщить модератору
 Re: Найти ошибки пересечения периодов а архиве  [new]
cptngrb
Member

Откуда:
Сообщений: 307
Stax,
строчки в которых ошибки
4 фев 19, 14:31    [21801310]     Ответить | Цитировать Сообщить модератору
 Re: Найти ошибки пересечения периодов а архиве  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15442
cptngrb
А как бы вы быстро нашли ошибки в архивной таблице, где могут быть заполнены периоды занимаемой должности с пересечением?..


а я бы не искал, а нафик запретил периоды с пересечением (см баян 9576198 )
4 фев 19, 14:36    [21801317]     Ответить | Цитировать Сообщить модератору
 Re: Найти ошибки пересечения периодов а архиве  [new]
cptngrb
Member

Откуда:
Сообщений: 307
orawish, я бы тоже не искал, если бы запретил вовремя
4 фев 19, 14:37    [21801318]     Ответить | Цитировать Сообщить модератору
 Re: Найти ошибки пересечения периодов а архиве  [new]
cptngrb
Member

Откуда:
Сообщений: 307
andrey_anonymous, спасибо
4 фев 19, 14:47    [21801332]     Ответить | Цитировать Сообщить модератору
 Re: Найти ошибки пересечения периодов а архиве  [new]
Stax
Member

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

начало периода не равно концу предыдущего (пересечение/дырка)
  1  with t(pos_id, emp_id, emp_position, fd, td) as
  2  (select 1, 1,      'уборщик', date'2017-01-01', date'2017-01-10'
  3  from dual union all select 75, 1, 'ст.уборщик', date'2017-01-11', date'2017-01-25'
  4  from dual union all select 8654, 1, 'гл.уборщик', date'2017-01-22', date'2017-02-01'
  5  from dual
  6  )
  7  ,tt as (
  8  select t.*
  9  ,lag(td,1,fd-1) over (partition by emp_id order by fd /* td*/) la
 10  from t
 11  )
 12* select * from tt where fd<>la+1
SQL> /

    POS_ID     EMP_ID EMP_POSITI FD       TD       LA
---------- ---------- ---------- -------- -------- --------
      8654          1 гл.уборщик 22.01.17 01.02.17 25.01.17

зы
21801221

.....
stax
4 фев 19, 15:08    [21801364]     Ответить | Цитировать Сообщить модератору
 Re: Найти ошибки пересечения периодов а архиве  [new]
cptngrb
Member

Откуда:
Сообщений: 307
Stax, спасибо
4 фев 19, 15:34    [21801393]     Ответить | Цитировать Сообщить модератору
 Re: Найти ошибки пересечения периодов а архиве  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 17182
Stax
  9  ,lag(td,1,fd-1) over (partition by emp_id order by fd /* td*/) la


При всем уважении - никто не обещал, что пересекаются именно соседние записи.
Ошибиться запросто могли, for ex, в годе.
4 фев 19, 15:34    [21801394]     Ответить | Цитировать Сообщить модератору
 Re: Найти ошибки пересечения периодов а архиве  [new]
Stax
Member

Откуда: Ukraine,Lviv
Сообщений: 1712
andrey_anonymous
Stax
  9  ,lag(td,1,fd-1) over (partition by emp_id order by fd /* td*/) la


При всем уважении - никто не обещал, что пересекаются именно соседние записи.
Ошибиться запросто могли, for ex, в годе.


абсолютно согласен, см 21801221

начало=конец предыдущего самый простой случай, но часто етого достаточно

я старался озвучить что ето не совсем "Найти ошибки пересечения периодов а архиве "

напр дырка, ето ошибка для архива или нет? формально нет, не пересекается

ps
пересекающиеся часто обсуждали, я б делал через exists

опять же форма вывода, напр пересекается с несколькими, надо выводить с кем или токо сам факт

А пересекается с Б, значит Б с А, надо оба выводить, и тд

....
stax
4 фев 19, 17:34    [21801471]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить