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

Откуда:
Сообщений: 276
всем доброго дня :-)
Имеем исторические таблицы во вражеской подсистеме где идентификатор не уникален. При связке таблиц опираюсь на ID + начальная дата + конечная дата. Но это действительно враги так как они неустановили уникальный ключ даже на эту связку и поэтому приходится пересечения бить еще на мелкие диапозоны.
Вот тэстовые данные:
DROP TABLE test_a
/
CREATE TABLE test_a(type_id NUMBER(2,0),char_col CHAR(2),x DATE,y DATE)
/
INSERT INTO test_a
     VALUES (1, 'AA', TO_DATE ('24.09.2007 12:33:50', 'dd.mm.yyyy hh24:mi:ss'),
             TO_DATE ('25.09.2007 13:15:10', 'dd.mm.yyyy hh24:mi:ss'))
/
INSERT INTO test_a
     VALUES (1, 'AB', TO_DATE ('25.09.2007 13:15:11', 'dd.mm.yyyy hh24:mi:ss'),
             TO_DATE ('25.09.2007 20:00:00', 'dd.mm.yyyy hh24:mi:ss'))
/
INSERT INTO test_a
     VALUES (1, 'AC', TO_DATE ('24.09.2007 23:09:30', 'dd.mm.yyyy hh24:mi:ss'),
             TO_DATE ('25.09.2007 15:15:00', 'dd.mm.yyyy hh24:mi:ss'))
/
INSERT INTO test_a
     VALUES (2, 'BA', TO_DATE ('24.09.2007 03:03:03', 'dd.mm.yyyy hh24:mi:ss'),
             TO_DATE ('24.09.2007 23:00:00', 'dd.mm.yyyy hh24:mi:ss'))
/
DROP TABLE test_b
/
CREATE TABLE test_b(type_id NUMBER(2,0),num_col NUMBER(2,0),x DATE,y DATE)
/
INSERT INTO test_b
     VALUES (1, 11, TO_DATE ('24.09.2007 01:01:01', 'dd.mm.yyyy hh24:mi:ss'),
             TO_DATE ('25.09.2007 14:00:00', 'dd.mm.yyyy hh24:mi:ss'))
/
INSERT INTO test_b
     VALUES (1, 12, TO_DATE ('25.09.2007 01:00:00', 'dd.mm.yyyy hh24:mi:ss'),
             TO_DATE ('25.09.2007 19:59:58', 'dd.mm.yyyy hh24:mi:ss'))
/
INSERT INTO test_b
     VALUES (2, 21, TO_DATE ('24.09.2007 22:00:00', 'dd.mm.yyyy hh24:mi:ss'),
             TO_DATE ('25.09.2007 22:00:00', 'dd.mm.yyyy hh24:mi:ss'))
/
COMMIT
/
SELECT *
  FROM test_a
/
SELECT *
  FROM test_b
/
SELECT   *
    FROM (SELECT type_id, char_col, num_col, seg AS x,
                 LEAD (seg - (1 / 24 / 3600)) OVER (PARTITION BY type_id ORDER BY seg) AS y
            FROM (SELECT type_id, char_col, NULL AS num_col, x AS seg
                    FROM test_a
                  UNION
                  SELECT type_id, char_col, NULL AS num_col, y + (1 / 24 / 3600) AS seg
                    FROM test_a
                  UNION
                  SELECT type_id, NULL AS char_col, num_col, x AS seg
                    FROM test_b
                  UNION
                  SELECT type_id, NULL AS char_col, num_col, y + (1 / 24 / 3600) AS seg
                    FROM test_b))
   WHERE x <= y
ORDER BY type_id, x
/
Вот только представте что таблиц у меня 10 (а не 2 как в тесте) и связке может присудствовать еще несколько полей. Если написать по типу тэстового примера получится портянка в несколько листов. Есть у кого какие варианты как сделать запрос более читаемым. Рад буду любым вариантам, даже более порнянистым :=) (для самообразования)
24 сен 07, 14:22    [4706365]     Ответить | Цитировать Сообщить модератору
 Re: Подинтервалы времени  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 18351
Вы бы рассказали что хотите получить...
Если, например, просто соединить по type_id, то все тривиально:
select a.type_id, a.char_col, b.num_col, greatest(a.x,b.x) x, least(a.y, b.y) y
from ane_test_a a
   , ane_test_b b
where a.x < b.y
  and b.x < b.y
  and a.type_id=b.type_id;

TYPE_ID CHAR_COL NUM_COL X           Y
------- -------- ------- ----------- -----------
      1 AA            11 24/09/2007  25/09/2007
      1 AB            11 25/09/2007  25/09/2007
      1 AC            11 24/09/2007  25/09/2007
      1 AA            12 25/09/2007  25/09/2007
      1 AB            12 25/09/2007  25/09/2007
      1 AC            12 25/09/2007  25/09/2007
      2 BA            21 24/09/2007  24/09/2007

7 rows selected
24 сен 07, 15:17    [4706799]     Ответить | Цитировать Сообщить модератору
 Re: Подинтервалы времени  [new]
4uko
Member

Откуда:
Сообщений: 276
to andrey_anonymous
Вы не учли что есть пересечения как и внутри одной таблицы так и при соеденения таблиц.
Если посмотрите то результат будет отличатся. Вы показали пересечение между 2 диапазонов но не разбили их
24 сен 07, 15:32    [4706911]     Ответить | Цитировать Сообщить модератору
 Re: Подинтервалы времени  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 18351
4uko
to andrey_anonymous
Вы не учли что есть пересечения как и внутри одной таблицы так и при соеденения таблиц.
Если посмотрите то результат будет отличатся. Вы показали пересечение между 2 диапазонов но не разбили их

Вы до сих пор не сказали, что хотите получить.
24 сен 07, 15:34    [4706931]     Ответить | Цитировать Сообщить модератору
 Re: Подинтервалы времени  [new]
4uko
Member

Откуда:
Сообщений: 276
Хочу получить из двух пересекаемых интервала три самостоятельных с флагом на одном из трех что это место пересечения.
24 сен 07, 15:44    [4707013]     Ответить | Цитировать Сообщить модератору
 Re: Подинтервалы времени  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 18351
4uko
Хочу получить из двух пересекаемых интервала три самостоятельных с флагом на одном из трех что это место пересечения.

Можно. Но сначала скажите - зачем.
Несколько лет работал с подобной организацией данных, но конкретно такая "хотелка" никогда не возникала.
24 сен 07, 15:46    [4707033]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить