Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Не получили письмо с кодом активации?
Январь 17, 2018, 07:59:55 am

Автор Тема: Оптимизация создания таблицы  (Прочитано 1435 раз)

Оффлайн d.pimkin

  • Новичок
  • *
  • Сообщений: 28
  • Рейтинг: +3/-0
    • Просмотр профиля
Оптимизация создания таблицы
« : Март 01, 2015, 08:48:17 pm »
Всем доброго времени суток!

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

  • Administrator
  • Hero Member
  • *****
  • Сообщений: 1012
  • Страна: ru
  • Рейтинг: +104/-0
    • Просмотр профиля
Re: Оптимизация создания таблицы
« Ответ #1 : Март 01, 2015, 09:32:06 pm »
А если просто отсортировать список по тригерам и времени, и формировать новое поле с условием и peek()
Ведь отсортированный список подразумевает что следующее значение поля time для одного и того же тригера будет ближайшим минимальным из всего ряда значений времени для этого тригера.

Оффлайн d.pimkin

  • Новичок
  • *
  • Сообщений: 28
  • Рейтинг: +3/-0
    • Просмотр профиля
Re: Оптимизация создания таблицы
« Ответ #2 : Март 02, 2015, 01:35:34 am »
Да, спасибо.

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

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

Re: Оптимизация создания таблицы
« Ответ #2 : Март 02, 2015, 01:35:34 am »