Неофициальный форум пользователей Qlik Sense & Qlikview

Для разработчиков => Вопросы по Qlik Sense & QlikView => Тема начата: d.pimkin от 01 марта 2015, 08:48:17

Название: Оптимизация создания таблицы
Отправлено: d.pimkin от 01 марта 2015, 08:48:17
Всем доброго времени суток!

Вот уже 3й день борюсь с QlikView и пытаюсь придумать максимально эффективный метод формирования таблицы.
Итак, изначально есть QVD таблица, имеющая чуть более 600к записей, следующего типа:

triggerid   time                              value
46397   2015-02-20 11:23:21   0
46397   2015-02-20 11:11:22   1
46397   2015-02-12 10:35:21   0
47654   2015-02-20 11:23:48   0
47654   2015-02-20 11:10:48   1
47654   2015-02-15 12:15:48   0

Нужно для каждого значения time, принадлежащего определенному triggerid, найти время следующего события, т.е. минимальное время из больших данного для данного triggerid.

Нужно получить следующую таблицу:

triggerid   time                           value  nexttime
46397   2015-02-20 11:23:21   0   null
46397   2015-02-20 11:11:22   1   2015-02-20 11:23:21
46397   2015-02-12 10:35:21   0   2015-02-20 11:11:22
47654   2015-02-20 11:23:48   0   null
47654   2015-02-20 11:10:48   1   2015-02-20 11:23:48
47654   2015-02-15 12:15:48   0   2015-02-20 11:10:48

Такие задачи обычно решаются через join, что я, собственно, и сделал.
Работает отлично, если я в запросе укажу небольшое кол-во triggerid. Однако при большом кол-ве, ОЗУ достаточно быстро забивается до отказа.

Реализовал загрузку следующим образом:

tmp:
LOAD
triggerid,
    time as DownTime
FROM Table_events.qvd (qvd);

Left Join
LOAD
triggerid,
    time as UpTime
FROM Table_events.qvd (qvd);

STORE tmp into Temp.qvd (qvd);
DROP Table tmp;

tmp:
LOAD
triggerid,
DownTime,
min(UpTime) as UpTime
from Temp.qvd (qvd)
Where DownTime<UpTime
Group by triggerid, DownTime;

STORE tmp into Temp.qvd (qvd);
DROP Table tmp;

tmp:
LOAD triggerid,
     timestamp(DownTime) as TriggerDown,
     timestamp(UpTime) as TriggerUp,
     Interval(UpTime-DownTime,'hh:mm:ss') as Diff,
     Date(DownTime) as TriggerDownDate
FROM Temp.qvd (qvd);

STORE tmp into D:\QlickView\Data\Event.qvd (qvd);
DROP Table tmp;


Рабочая машина: 32Гб ОЗУ, 16 ЦПУ
Название: Re: Оптимизация создания таблицы
Отправлено: admin от 01 марта 2015, 09:32:06
А если просто отсортировать список по тригерам и времени, и формировать новое поле с условием и peek()
Ведь отсортированный список подразумевает что следующее значение поля time для одного и того же тригера будет ближайшим минимальным из всего ряда значений времени для этого тригера.
Название: Re: Оптимизация создания таблицы
Отправлено: d.pimkin от 02 марта 2015, 01:35:34
Да, спасибо.

Уже как раз так и реализовал в SQL запросе.
Не понимаю, почему мне сразу в голову это не пришло. Перебрал очень много способов. Очень долго пытался организовать это посредством скрипта в QlikView.