Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Сравнение записей с учетом данных в подчиненной таблице / 5 сообщений из 5, страница 1 из 1
30.12.2016, 10:48
    #39378172
ln123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнение записей с учетом данных в подчиненной таблице
Есть таблица t1
Код: plsql
1.
 create table t1 (id number, dBegin date, dEnd date) 


к ней есть подчиненная таблица t2
Код: plsql
1.
 create table t2 (id number, idt1 number, nOrder number, fValue number ....)


Отношение таблиц t1 и t2 один ко многим.
Так же есть запрос
Код: plsql
1.
 select  dBegin, dEnd, nOrder, fValue ... from ... 

на основании которого я собираюсь вставлять данные в t1, t2.
Но перед вставкой мне хотелось бы сделать 2 вещи:
1. В запросе объединить периоды с одинаковыми данными в один более большой период т.е. два периода для которых dEnd+1 (первого) = dBegin (второго) и все остальные колонки совпадают для всех строк первого и второго периода
2. Проверить что в таблице t1 не существует периода с такими же данными в таблице t2 как те данные что возвращает мой запрос

Единственный путь который я пока придумал это преобразовать мой запрос к виду
Код: plsql
1.
select dbegin, dEnd, listagg(nOrder||' '||fValue ...) within group (order by nOrder) s from ...


дальше все становится тривиальным, но меня смущает то что результат listagg не может быть больше 4000 символов, а в моем случае это теоретически возможно :(
Может есть какой нибудь другой способ?

P.S. Результирующий код должен работать в 11.2 и 12.1 и хорошо бы (но не обязательно) в postgresql (там как раз с вариантом агрегации в строку все хорошо). Собственно я рассматривал еще следующие варианты агрегации: 1. wm_concate - не работает в 12.1,
2. Агрегация в json - нет в 11.2
3. Агрегация в xml - сравнение xmltype просто так не работает нужно дополнительное преобразование
...
Рейтинг: 0 / 0
30.12.2016, 11:21
    #39378192
Сравнение записей с учетом данных в подчиненной таблице
ln123,

посчитай crc какой-нибудь и сравнивай
...
Рейтинг: 0 / 0
30.12.2016, 12:54
    #39378259
ln123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнение записей с учетом данных в подчиненной таблице
посчитать crcln123,

посчитай crc какой-нибудь и сравнивай

Ключевое слово какой-нибудь :), я не знаю агрегирующих функций для расчета crc к тому же поддерживающих либо order by либо не зависящие от порядка поступления данных на вход, а Вы?

В общем сейчас набросал еще один вариант решения:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
with period as (select dBegin, dEnd from ...), --Запрос на получение периодов 
MainSelect as (select  dBegin, dEnd, nOrder, fValue ... from ... ), --Собственно основной запрос для формирования записей в таблицах t1, t2
PeriodUnion (dBegin, dEnd) as (select min(t.dBegin ) dBegin, max(p.dEnd) dend  
                               from (select dBegin, dEnd, sum(st) over(order by dBegin) gn 
                                      from (select p.dBegin, p.dEnd, case when lag(p.dEnd) over(order by p.dBegin)+1 = p.dBegin then 0 else 1 end st
                                             from period p where not exists (select nOrder, fValue ...
                                                                      from MainSelect c where c.dBegin = p.dBegin
                                                                      minus
                                                                      select nOrder, fValue ...
                                                                      from MainSelect c where c.dBegin = p.dEnd + 1 )) t) t
                                                                 inner join period p on  p.dBegin = t.dEnd + 1
                                                                 group by gn)
                                                               
select p.dBegin, p.dEnd, c.nOrder, fValue ... from MainSelect c 
inner join PeriodUnion p on  c.dBegin = p.dBegin 
union all                                                                 
select c.dBegin, c.dEnd, c.nOrder, fValue ... from MainSelect c where not exists (select p.dBegin from PeriodUnion p where c.dBegin between p.dBegin and p.dEnd)                                                                 



таким образом, я получу объединение периодов с одинаковыми данными, на а дальше тем же способом отфильтрую те записи которые уже есть в t1, t2
Видимо если кто нибудь не предложит вариант лучше остановлюсь на этом
...
Рейтинг: 0 / 0
30.12.2016, 19:27
    #39378473
stax..
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнение записей с учетом данных в подчиненной таблице
ln123,

по старінке (схлопнуть интервалы)
https://groups.google.com/forum/?hl=ru#!topic/fido7.ru.rdbms.oracle/UqO_JFGcb8s

p у Вас набор уникальных полей
Код: 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.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
with po as (
select 1 p,date '2016-01-01' d1,date '2016-01-07' d2 from dual union all
select 1 p,date '2016-01-08' d1,date '2016-01-17' d2 from dual union all
select 1 p,date '2016-01-18' d1,date '2016-01-27' d2 from dual union all
select 1 p,date '2016-01-28' d1,date '2016-01-29' d2 from dual union all
select 1 p,date '2016-01-31' d1,date '2016-02-05' d2 from dual union all
select 1 p,date '2016-02-06' d1,date '2016-04-11' d2 from dual union all
--
select 2 p,date '2017-02-28' d1,date '2017-03-29' d2 from dual union all
select 2 p,date '2017-03-30' d1,date '2017-03-15' d2 from dual union all
select 2 p,date '2017-03-16' d1,date '2017-08-11' d2 from dual union all
--
select 3 p,date '2016-01-31' d1,date '2016-02-05' d2 from dual union all
select 3 p,date '2016-02-06' d1,date '2016-04-11' d2 from dual 
)
select p,min(d1) dStart, max(d2) dEnd from (
select
    p
   ,d1
   ,d2
   ,sum(d2-d1+1) over (partition by p order by d1) dd
from po
)
group by
 p,d2-dd
order by 1,2
/

SQL> /

         P DSTART   DEND
---------- -------- --------
         1 01.01.16 29.01.16
         1 31.01.16 11.04.16
         2 28.02.17 29.03.17
         2 16.03.17 11.08.17
         2 30.03.17 15.03.17
         3 31.01.16 11.04.16

6 rows selected.



......
stax
...
Рейтинг: 0 / 0
03.01.2017, 17:28
    #39379229
ln123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнение записей с учетом данных в подчиненной таблице
stax..ln123,

по старінке (схлопнуть интервалы)
https://groups.google.com/forum/?hl=ru#!topic/fido7.ru.rdbms.oracle/UqO_JFGcb8s

p у Вас набор уникальных полей
......
stax

Схлопывать интервалы по набору уникальных полей я умею (хотя я это делаю немного иначе чем вы см. мой пост выше), особенность моей ситуации в том что схлопывать нужно по совпадению набора записей в подчиненной таблице. Т.е. набор уникальных полей еще как то получить нужно, в лоб агрегацией строк из подчиненной таблицы в varchar2 не очень хорошо т.к. в 4000 символов помещается только 40 строк, а у меня теоретически может быть больше.
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Сравнение записей с учетом данных в подчиненной таблице / 5 сообщений из 5, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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