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

Для разработчиков => Вопросы по Qlik Sense & QlikView => Тема начата: d.pimkin от 07 июня 2015, 06:45:11

Название: Удалить лишние записи qvd-таблицы в Qlikview (Qlik Sense)
Отправлено: d.pimkin от 07 июня 2015, 06:45:11
Всем доброго времени суток!

Имеется следующая таблица событий:
(https://qliksense-forum.ru/qvf/proxy.php?request=http%3A%2F%2Fs013.radikal.ru%2Fi323%2F1506%2F9f%2Faf1a8fe1d185.png&hash=6c734911cbe31c70fec1c00c9cc3ebd05c054f0c)
где 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.

Например, из таблицы выше нужно получить следующую:
(https://qliksense-forum.ru/qvf/proxy.php?request=http%3A%2F%2Fs017.radikal.ru%2Fi428%2F1506%2F35%2Ff3380fbb6287.png&hash=ce6426004c37f2066558982b836c119f268dce0d)

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

П.С. Скорее всего, записи надо как-то грамотно сгруппировать.
Название: Re: Удалить лишние записи таблицы
Отправлено: admin от 08 июня 2015, 08:27:00
День добрый.
Надо добавить флаг на смену состояния.
Например, сменилось состояние сенсора - ставим уникальный номер либо 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;
Название: Re: Удалить лишние записи таблицы
Отправлено: d.pimkin от 09 июня 2015, 02:25:20
Благодарю! Чего-то я и не сообразил сразу.

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

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