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

Откуда:
Сообщений: 19
Доброго всем дня, а также счастливой Хануки форумчане.

Буду признателен за любую идею или направление для поиска для рашения задачи ниже.

Информацию даую только по одной уникальной записи Item_name='4Г', если продумать алгоритм только для одной, то и для других он будет такой же.
Есть две таблицы COMPLET и STAT с данными:

COMPLET
ITEM_NAMESTART_DATETIMEEND_DATETIMESTATUS
21.02.2010 03.05.2010 IN_DRILLING
03.05.201012.05.2010 PRODUCING
12.05.2010 01.06.2010 SHUT_IN
01.06.2010 01.01.2011 SHUT_IN_CURRENT_YEAR
01.01.2011 12.11.2011 SHUT_IN_PREVIOUS_YEARS
12.11.2011 30.11.2011 SHUT_IN_PREVIOUS_YEARS
30.11.2011 07.12.2011 SHUT_IN_PREVIOUS_YEARS
07.12.2011 31.12.2011 PRODUCING
31.12.2011 01.02.2012 PRODUCING
01.02.2012 30.04.2013 PRODUCING
30.04.2013 01.01.9000 PRODUCING


STAT
ITEM_NAMESTART_DATETIMEEND_DATETIMESTATUS
21.02.2010 03.05.2010 IN_DRILLING
03.05.2010 12.05.2010 PRODUCING
12.05.2010 30.06.2010 SHUT_IN
30.06.2010 31.12.2010 SHUT_IN_CURRENT_YEAR
31.12.2010 07.12.2011 SHUT_IN_PREVIOUS_YEARS
07.12.2011 09.12.2011 SHUT_IN
09.12.2011 11.12.2011 PRODUCING
11.12.2011 12.12.2011 SHUT_IN
12.12.2011 13.12.2011 PRODUCING
13.12.2011 15.12.2011 SHUT_IN
15.12.2011 12.02.2012 PRODUCING
12.02.2012 13.02.2012 SHUT_IN
13.02.2012 06.04.2012 PRODUCING
06.04.2012 31.05.2012 SHUT_IN
31.05.2012 31.12.2012 SHUT_IN_CURRENT_YEAR
31.12.2012 17.01.2013 SHUT_IN_PREVIOUS_YEARS
17.01.2013 20.01.2013 PRODUCING
20.01.2013 21.01.2013 SHUT_IN
21.01.2013 24.01.2013 PRODUCING
24.01.2013 01.02.2013 SHUT_IN
01.02.2013 23.02.2013 PRODUCING
23.02.2013 31.03.2013 SHUT_IN
31.03.2013 01.01.9000 SHUT_IN_CURRENT_YEAR


Нужно написать скрипт, который находит ошибки в условий:
Статус в COMPLET должен совпадать со статусом в STAT и временый интервалы должны совпадать

Вся сложность именно в том что ошибки во временых интервалах, где то они боль, где-то меньше.
Пыталься придумать что-нибудь через JOIN и условия выборки даты, но увы, фиаско.

В данном примере, например, если соотносить данные, то выделенное зеленым не ошибка, а выделенное красным ошибка
COMPLETSTAT
ITEM_NAME START_DATETIME END_DATETIME STATUSITEM_NAME START_DATETIME_1 END_DATETIME_1 STATUS_1
07.12.2011 31.12.2011 PRODUCING 09.12.2011 11.12.2011 PRODUCING
12.05.2010 01.06.2010 SHUT_IN 12.05.2010 30.06.2010 SHUT_IN
28 ноя 13, 13:04    [15205391]     Ответить | Цитировать Сообщить модератору
 Re: Как соотнести данные между собой  [new]
vox22
Member

Откуда: Одесса
Сообщений: 104
То есть вам нужно чтобы все интервалы из STAT укладывались внутри интервалов COMPLET c одинаковым STATUS?
28 ноя 13, 17:00    [15207330]     Ответить | Цитировать Сообщить модератору
 Re: Как соотнести данные между собой  [new]
vox22
Member

Откуда: Одесса
Сообщений: 104
PL/SQL или чистый SQL?
28 ноя 13, 17:00    [15207337]     Ответить | Цитировать Сообщить модератору
 Re: Как соотнести данные между собой  [new]
-=APS=-
Member

Откуда: Киев
Сообщений: 737
Что-то типа такого не подойдет?
select * 
from complet c, stat s
where c.item_name = s.item_name 
  and (c.start_datetime, c.end_datetime) overlaps (s.start_datetime, s.end_datetime)
  and c.status <> s.status
28 ноя 13, 18:30    [15207818]     Ответить | Цитировать Сообщить модератору
 Re: Как соотнести данные между собой  [new]
-=APS=-
Member

Откуда: Киев
Сообщений: 737
А, стоп, не так понял ваше условие насчет совпадения интервалов.
28 ноя 13, 18:34    [15207839]     Ответить | Цитировать Сообщить модератору
 Re: Как соотнести данные между собой  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15487
ELV1S_86,

обычные операции с множествами - например
MINUS
28 ноя 13, 18:42    [15207877]     Ответить | Цитировать Сообщить модератору
 Re: Как соотнести данные между собой  [new]
ELV1S_86
Member

Откуда:
Сообщений: 19
vox22,

vox22
То есть вам нужно чтобы все интервалы из STAT укладывались внутри интервалов COMPLET c одинаковым STATUS

Да, интервалы STAT должны укладываться внутри интервалов COMPLET, если они укладываются сравниваем STATUS, если STATUS'ы не сходяться, то эта ошибка и ее нужно показать.
НО если приглядеться к данным, в них ошибки с датами, их тоже нужно вывести на чисту воду, вот в этом вся и загвостка

Желательно конечно чистый SQL, так как запрос потом нужно будет запихнуть в xml файл.
Но можно попробовать и PL/SQL, на всякий случай данный о системе:
Oracle Database 10g Enterprise Edition Release 10.2.0.5.0 - 64bi
PL/SQL Release 10.2.0.5.0 - Production
"CORE 10.2.0.5.0 Production"
TNS for Linux: Version 10.2.0.5.0 - Production
NLSRTL Version 10.2.0.5.0 - Production
29 ноя 13, 07:45    [15209508]     Ответить | Цитировать Сообщить модератору
 Re: Как соотнести данные между собой  [new]
ELV1S_86
Member

Откуда:
Сообщений: 19
-=APS=-,

-=APS=-
Что-то типа такого не подойдет?

select *
from complet c, stat s
where c.item_name = s.item_name
and (c.start_datetime, c.end_datetime) overlaps (s.start_datetime, s.end_datetime)
and c.status <> s.status


Ваш запрос правильный, и он бы отлично подошел, если бы не было косяков в самих данных с датами.
В этих неточностях в данных и есть вся загвоздка...поэтому и прошу помощи:)
29 ноя 13, 07:56    [15209521]     Ответить | Цитировать Сообщить модератору
 Re: Как соотнести данные между собой  [new]
казинак
Member

Откуда:
Сообщений: 1273
ELV1S_86
Да, интервалы STAT должны укладываться внутри интервалов COMPLET, если они укладываются сравниваем STATUS, если STATUS'ы не сходяться, то эта ошибка и ее нужно показать.
НО если приглядеться к данным, в них ошибки с датами, их тоже нужно вывести на чисту воду, вот в этом вся и загвостка

В чем ошибка то? В том что второй интервал больше первого?
Это можно отсечь тупым условием типа
(COMPLET.END_DATETIME-COMPLET.START_DATETIME_DATETIME) > (STAT.END_DATETIME-STAT.START_DATETIME_DATETIME)

Или еще какие косяки? Сформулируй. А народ подскажет...
29 ноя 13, 08:20    [15209569]     Ответить | Цитировать Сообщить модератору
 Re: Как соотнести данные между собой  [new]
vox22
Member

Откуда: Одесса
Сообщений: 104
Да, в чем же ошибки в данных?
29 ноя 13, 20:01    [15215093]     Ответить | Цитировать Сообщить модератору
 Re: Как соотнести данные между собой  [new]
ELV1S_86
Member

Откуда:
Сообщений: 19
Добрый день, извините что долго не отвечал.

Я немного облегчу начальное условие, а именно таблица COMPLET выглядит так:

COMPLET
ITEM_NAMESTART_DATETIMEEND_DATETIMESTATUS
21.02.2010 03.05.2010 IN_DRILLING
03.05.201012.05.2010 PRODUCING
12.05.2010 01.06.2010 SHUT_IN
01.06.2010 01.01.2011 SHUT_IN_CURRENT_YEAR
01.01.2011 07.12.2011 SHUT_IN_PREVIOUS_YEARS
07.12.201101.01.9000 PRODUCING


Её нежно соотнести с таблицой STAT по датам, другими словами через join и сравнивать даты.

По идее, при даком соотнесении по датам, на свет должно появиться вот такой результат, но сделать это не получается, так как в датах есть ошибки, выделенные красным:

ITEM_NAME START_DATETIME END_DATETIME STATUS ITEM_NAME START_DATETIME END_DATETIME STATUS
1 21.02.2010 03.05.2010 IN_DRILLING 21.02.2010 03.05.2010 IN_DRILLING
2 03.05.2010 12.05.2010 PRODUCING 03.05.2010 12.05.2010 PRODUCING
3 12.05.2010 01.06.2010 SHUT_IN 12.05.201030.06.2010 SHUT_IN
4 01.06.2010 01.01.2011 SHUT_IN_CURRENT_YEAR 30.06.2010 31.12.2010 SHUT_IN_CURRENT_YEAR
5 01.01.2011 07.12.2011 SHUT_IN_PREVIOUS_YEARS 31.12.2010 07.12.2011 SHUT_IN_PREVIOUS_YEARS
6 07.12.2011 01.01.9000 PRODUCING 07.12.2011 09.12.2011 SHUT_IN
7 07.12.2011 01.01.9000 PRODUCING 09.12.2011 11.12.2011 PRODUCING
8 07.12.2011 01.01.9000 PRODUCING 11.12.2011 12.12.2011 SHUT_IN
9 07.12.2011 01.01.9000 PRODUCING 12.12.2011 13.12.2011 PRODUCING
10 07.12.2011 01.01.9000 PRODUCING 13.12.2011 15.12.2011 SHUT_IN
11 07.12.2011 01.01.9000 PRODUCING 15.12.2011 12.02.2012 PRODUCING
12 07.12.2011 01.01.9000 PRODUCING 12.02.2012 13.02.2012 SHUT_IN
13 07.12.2011 01.01.9000 PRODUCING 13.02.2012 06.04.2012 PRODUCING
14 07.12.2011 01.01.9000 PRODUCING 06.04.2012 31.05.2012 SHUT_IN
15 07.12.2011 01.01.9000 PRODUCING 31.05.2012 31.12.2012 SHUT_IN_CURRENT_YEAR
16 07.12.2011 01.01.9000 PRODUCING 31.12.2012 17.01.2013 SHUT_IN_PREVIOUS_YEARS
17 07.12.2011 01.01.9000 PRODUCING 17.01.2013 20.01.2013 PRODUCING
18 07.12.2011 01.01.9000 PRODUCING 20.01.2013 21.01.2013 SHUT_IN
19 07.12.2011 01.01.9000 PRODUCING 21.01.201324.01.2013 PRODUCING
20 07.12.2011 01.01.9000 PRODUCING 24.01.2013 01.02.2013 SHUT_IN
21 07.12.2011 01.01.9000 PRODUCING 01.02.2013 23.02.2013 PRODUCING
22 07.12.2011 01.01.9000 PRODUCING 23.02.2013 31.03.2013 SHUT_IN
23 07.12.2011 01.01.9000 PRODUCING 31.03.2013 01.01.9000 SHUT_IN_CURRENT_YEAR
10 дек 13, 16:01    [15272358]     Ответить | Цитировать Сообщить модератору
 Re: Как соотнести данные между собой  [new]
Добрый Э - Эх
Guest
ELV1S_86,

не совсем понятно, почему "соотношение" вышло у тебя такое кастрированное. Но, как вариант, попробуй такое:

select c.*,s.*,
       case 
         when s.status != c.status then 'Achtung !!!'
         else 'OK'
       end as status_check,
       case 
          when c.start_datetime > s.start_datetime 
               or
               c. end_datetime < s.end_datetime
         then 'Achtung !!!'
         else 'OK'
       end as date_check
  from complet c
  join STAT s
    on c.item_name = s.item_name
   and c.end_datetime >= s.start_datetime
   and s.end_datetime >= c.start_datetime
 order by c.start_datetime
11 дек 13, 06:34    [15274602]     Ответить | Цитировать Сообщить модератору
 Re: Как соотнести данные между собой  [new]
ELV1S_86
Member

Откуда:
Сообщений: 19
Добрый Э - Эх,

В очередной раз спасибо! Я со всем разобрался.

И спасибо всем соучастникам.
11 дек 13, 10:34    [15275396]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить