Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Не получили письмо с кодом активации?
Октябрь 17, 2018, 10:14:22 pm

Автор Тема: Удалить лишние записи qvd-таблицы в Qlikview (Qlik Sense)  (Прочитано 2252 раз)

Оффлайн d.pimkin

  • Новичок
  • *
  • Сообщений: 28
  • Рейтинг: +3/-0
    • Просмотр профиля
Всем доброго времени суток!

Имеется следующая таблица событий:

где ID -идентификатор оборудования, EventId - id события, FromDate - дата начала события, ToDate - дата окончания события, EventValue - состояние оборудования в данный промежуток времени (0 - OK, 1 - Problem).
Таблица отсортирована по ID, EventId (чем больше FromDate, тем больше EventId).

Задача состоит в том, чтобы удалить лишние записи: если несколько событий подряд идут с одним и тем же EventValue, то оставляем минимальный EventId и FromDate, а к нему добавляем максимальный ToDate. В итоге не должно быть одинаковых подряд идущих EventValue.
Фактически, верхние 3 записи из данной таблицы говорят о том, что оборудование находилось в состоянии 0 (ОК) с 07.06.2015 13:58:00 по 07.06.2015 18:09:00.

Например, из таблицы выше нужно получить следующую:


Все это нужно сделать в скрипте загрузок.

П.С. Скорее всего, записи надо как-то грамотно сгруппировать.

Оффлайн admin

  • Administrator
  • Hero Member
  • *****
  • Сообщений: 1206
  • Страна: ru
  • Рейтинг: +128/-0
    • Просмотр профиля
Re: Удалить лишние записи таблицы
« Ответ #1 : Июнь 08, 2015, 08:27:00 am »
День добрый.
Надо добавить флаг на смену состояния.
Например, сменилось состояние сенсора - ставим уникальный номер либо EventId.
Затем по нему и группируем.
temp1:
LOAD * INLINE [
    ID, EventID, FromDate, ToDate, EventValue, Flag
    80542, 1317759, 07.06.2015 12:25:00, 07.06.2015 12:26:00, 0, 1317759
    80542, 1317765, 07.06.2015 12:26:00, 07.06.2015 12:39:00, 0, 1317759
    80542, 1317829, 07.06.2015 12:39:00, 07.06.2015 12:40:00, 1, 1317829
    80542, 1317841, 07.06.2015 12:40:00, 07.06.2015 12:41:00, 0, 1317841
    80542, 1317846, 07.06.2015 12:41:00, 07.06.2015 13:12:00, 0, 1317841   
];

temp2:
NoConcatenate load ID,
min(EventID) as EventID,
min(FromDate) as FromDate,
max(ToDate) as ToDate,
Only(EventValue) as EventValue
Resident temp1
Group by ID, Flag
Order by ID, EventID, FromDate, ToDate;

DROP Table temp1;

Оффлайн d.pimkin

  • Новичок
  • *
  • Сообщений: 28
  • Рейтинг: +3/-0
    • Просмотр профиля
Re: Удалить лишние записи таблицы
« Ответ #2 : Июнь 09, 2015, 02:25:20 am »
Благодарю! Чего-то я и не сообразил сразу.

Единственное, поясню, что к предыдущей записи текущей загрузки поля, которого не было в исходной таблице, необходимо обращаться через peek, а не через Previous (который обращается к исходной таблице).

if(Previous(TriggerId)=TriggerId, if(Previous(EventValue)=EventValue,peek(Flag),peek(Flag)+1),0) as Flag

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

Re: Удалить лишние записи таблицы
« Ответ #2 : Июнь 09, 2015, 02:25:20 am »