Оптимизация создания таблицы

Автор d.pimkin, 01 марта 2015, 08:48:17

« назад - далее »

d.pimkin

Всем доброго времени суток!

Вот уже 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 ЦПУ

admin

А если просто отсортировать список по тригерам и времени, и формировать новое поле с условием и peek()
Ведь отсортированный список подразумевает что следующее значение поля time для одного и того же тригера будет ближайшим минимальным из всего ряда значений времени для этого тригера.

d.pimkin

Да, спасибо.

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

Яндекс.Метрика