Удалить лишние записи qvd-таблицы в Qlikview (Qlik Sense)

Автор d.pimkin, июня 07, 2015, 06:45:11 pm

« предыдущая - следующая »

d.pimkin

июня 07, 2015, 06:45:11 pm Последнее редактирование: июня 14, 2015, 03:19:00 pm от admin
Всем доброго времени суток!

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

где 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

День добрый.
Надо добавить флаг на смену состояния.
Например, сменилось состояние сенсора - ставим уникальный номер либо 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

Благодарю! Чего-то я и не сообразил сразу.

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

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

Рейтинг@Mail.ru Яндекс.Метрика