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

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

автор
Вообщем с MODEL пришлось некоторое время помучаться, но зато результат мне нравится больше, чем аналитические функции или использование присоединений с ODCINumberList

очень сильно я сомневаюсь. но это Ваше решение.

Вячеслав в свое время писал про хинты, которые очень мне пригодились. Даже не думал о них, но каким-то образом вышел на них. Главное чтобы не было равно магическому числу 3... :)
11 фев 17, 13:08    [20202956]     Ответить | Цитировать Сообщить модератору
 Re: Помогите составить историческую таблицу  [new]
Вячеслав Любомудров
Member

Откуда: Владивосток
Сообщений: 17214
K790
это же чистый DDL, какая там конкуренция?
Насчет DDL совсем не понял
Возможно, речь про DML?
Честно говоря, не очень понимаю, чем это сильно отличается от PL/SQL-цикла, за исключением того, что это выполняется в контексте SQL
Завышенное потребление CPU? -- ну дык как правило с этим как раз избыток
Если правила составлены нормально, то и с этим проблемы нет

PS. Думаю, человек, который этим занимался (dbms_photoshop) мог бы рассказать больше
11 фев 17, 14:48    [20203121]     Ответить | Цитировать Сообщить модератору
 Re: Помогите составить историческую таблицу  [new]
Alibek B.
Member

Откуда:
Сообщений: 2298
Финальная версия запроса работает хорошо и быстро.
Но не охватывает 2-3% записей, по которым операторы вносили данные некорректно.
Суть проблемы в том, что в журнале действий операторов фиксируются не все возможные варианты изменения группы клиента, возможны варианты задания/изменения группы, которые не фиксируются в журнале, такие как:
1. При создании нового клиента его группа нигде не фиксируется. Эту ситуацию я обрабатываю следующим образом: если после создания клиента его группа более не редактировалась, то в журнале записей не будет и можно полагать, что текущая группа клиента была задана при его создании; если же записи в журнале есть, то у первой записи будет OLD_VALUE.
2. При активации клиента для него задается группа и эта группа нигде не фиксируется. Тут я исхожу из допущения, что до активации все неактивированные клиенты находились в предопределенной группе, а после активации ситуация схожа с пунктом 1 (если записей в журнале нет, он был активирован с текущей группой, иначе в журнале нужно использовать OLD_VALUE).
Эти допущения покрывают более 95% случаев, но есть ситуации, когда операторы отходили от регламента и делали например так:
1. Клиент создан в предопределенной группе (группа0).
2. Клиента переместили в группу1.
3. С клиентом сделали некоторые операции.
4. Клиента переместили в группу2.
5. С клиентом сделали некоторые операции.
6. Клиента переместили в группу3.
7. Клиента активировали, при активации выбрали группу1.

В результате мой запрос считает, что клиент находится в группе3.
Просто отфильтровать записи в журнале, предшествующие активации, нельзя: клиент может быть не активирован и тогда нужно учитывать всю его историю, а если в критерии join добавлять что-то вроде and (log.MOMENT >= client.ACTIVATE_DATE or client.ACTIVATE_DATE is null), то очень серьезно падает производительность.

И тут я подумал, что возможно пора подумать о переборе в цикле.
Количество клиентов у меня не очень велико (сейчас порядка 10к, максимум будет 50к), зато я буду использовать императивный подход и не буду ограничен в логике обработки данных.
Или все же в SQL можно описать подобное условие без падения производительности?
15 фев 17, 09:05    [20212651]     Ответить | Цитировать Сообщить модератору
 Re: Помогите составить историческую таблицу  [new]
Alibek B.
Member

Откуда:
Сообщений: 2298
Или же, как пришло мне в голову сейчас, можно через union all объединить два разных варианта запроса, ориентированных на активированных и неактивированных клиентов.
15 фев 17, 09:07    [20212667]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 [2]      все
Все форумы / Oracle Ответить