Всем доброго времени суток!
Вот уже 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 ЦПУ
А если просто отсортировать список по тригерам и времени, и формировать новое поле с условием и peek()
Ведь отсортированный список подразумевает что следующее значение поля time для одного и того же тригера будет ближайшим минимальным из всего ряда значений времени для этого тригера.
Да, спасибо.
Уже как раз так и реализовал в SQL запросе.
Не понимаю, почему мне сразу в голову это не пришло. Перебрал очень много способов. Очень долго пытался организовать это посредством скрипта в QlikView.