FAQ по скрипту Qlik Sense/Qlik View часть 6

Q: Всем доброго времени суток!

Имеется следующая таблица событий:
где 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.

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

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

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

Q:Подскажите, каким образом вытащить текущую дату в Qlikview?

A: Можно вот так:
Код:
now()

или:
Код:
today()

Q: Есть следующая задачка:
необходимо контролировать сроки выполнения задач, при этом для более гибкого контроля в систему должен быть заложен сдвиг на 3 рабочих дня относительно планового срока.
Как посчитать разницы между датами в рабочих днях в справке описано, по своей задачке пока ничего не нашёл.

A: Возможно так подойдет: LastWorkDate (Data, 3).

Q: Подскажите как можно организовать загрузку обновленных данных. А именно имеется около 300 000 xml файлов число которых увеличивается ежедневно примерно на три пять тысяч. в каждом файле также примерно около 50 строк, перезагружать данные соответственно занимает очень много времени… привожу пример кода для удобства.
Код:
SET ThousandSep=’ ‘;
SET DecimalSep=’,’;
SET MoneyThousandSep=’ ‘;
SET MoneyDecimalSep=’,’;
SET MoneyFormat=’# ##0,00 ₽;-# ##0,00 ₽’;
SET TimeFormat=’h:mm:ss’;
SET DateFormat=’DD.MM.YYYY’;
SET TimestampFormat=’DD.MM.YYYY h:mm:ss[.fff]’;
SET MonthNames=’январь;февраль;март;апрель;май;июнь;июль;август;сентябрь;октябрь;ноябрь;декабрь’;
SET DayNames=’Пн;Вт;Ср;Чт;Пт;Сб;Вс’;

export:
Load
FileName() as [Имя файла],
[fcsNotificationEF/id] as id,
[fcsNotificationEF/purchaseNumber] as [№ закупки],
mid([fcsNotificationEF/docPublishDate],9,2) as [День публикации закупки],
Month(mid([fcsNotificationEF/docPublishDate],1,10)) as [Месяц публикации закупки],
mid([fcsNotificationEF/docPublishDate],1,4) as [Год публикации закупки],
mid([fcsNotificationEF/docPublishDate],9,2)& ‘ ‘ & Month (mid([fcsNotificationEF/docPublishDate],1,10))& ‘ ‘ &mid([fcsNotificationEF/docPublishDate],1,4) as [Дата публикации закупки],
ceil(Month(mid([fcsNotificationEF/docPublishDate],1,10))/3)&’ квартал’ as Квартал,
[fcsNotificationEF/href] as [Ссылка на ООС],
[fcsNotificationEF/purchaseObjectInfo] as [Предмет закупки],
[fcsNotificationEF/lot/maxPrice] as [НМЦК],
[fcsNotificationEF/lot/financeSource] as [Источник финансирования],
[fcsNotificationEF/lot/customerRequirements/customerRequirement/deliveryTerm] as [Сроки поставки товара],
[fcsNotificationEF/lot/customerRequirements/customerRequirement/applicationGuarantee/amount] as [Обеспечение заявки],
[fcsNotificationEF/lot/customerRequirements/customerRequirement/contractGuarantee/amount] as [Обеспечение контракта],
[fcsNotificationEF/lot/customerRequirements/customerRequirement/contractGuarantee/part] as [Процент на обеспечение исполнения контракта],
[fcsNotificationEF/lot/customerRequirements/customerRequirement/applicationGuarantee/part] as [Процент на обеспечение заявки],
[fcsNotificationEF/lot/customerRequirements/customerRequirement/kladrPlaces/kladrPlace/kladr/fullName]&’ ‘&[fcsNotificationEF/lot/customerRequirements/customerRequirement/kladrPlaces/kladrPlace/deliveryPlace] as [Место доставки товара, выполнения работ],
mid([fcsNotificationEF/procedureInfo/bidding/date],9,2)& ‘ ‘ & Month (mid([fcsNotificationEF/procedureInfo/bidding/date],1,10))& ‘ ‘ &mid([fcsNotificationEF/procedureInfo/bidding/date],1,4) as [Дата Аукциона/Определения победителя],
mid([fcsNotificationEF/procedureInfo/collecting/startDate],9,2)& ‘ ‘ & Month (mid([fcsNotificationEF/procedureInfo/collecting/startDate],1,10))& ‘ ‘ &mid([fcsNotificationEF/procedureInfo/collecting/startDate],1,4) as [Дата начала подачи документов],
[fcsNotificationEF/procedureInfo/collecting/place]&’ ‘&[fcsNotificationEF/ETP/name]&’ по адресу ‘&[fcsNotificationEF/ETP/url] as [Место подачи заявки],
[fcsNotificationEF/procedureInfo/collecting/order] as [Порядок подачи заявок],
mid([fcsNotificationEF/procedureInfo/collecting/endDate],9,2)& ‘ ‘ & Month (mid([fcsNotificationEF/procedureInfo/collecting/endDate],1,10))& ‘ ‘ &mid([fcsNotificationEF/procedureInfo/collecting/endDate],1,4) as [Дата окончания подачи документов],
[fcsNotificationEF/ETP/name] as [Площадка],
[fcsNotificationEF/ETP/url] as [Адрес площадки],
[fcsNotificationEF/placingWay/name] as [Тип закупки],
Replace([fcsNotificationEF/lot/purchaseObjects/purchaseObject/OKPD/code],’.’,’_’) as [ОКПД],
[fcsNotificationEF/lot/purchaseObjects/purchaseObject/OKPD/name] as [Наименование ОКПД],
[fcsNotificationEF/purchaseResponsible/responsibleInfo/contactEMail] as [EMail заказчика],
[fcsNotificationEF/purchaseResponsible/responsibleInfo/contactPhone] as [Телефон заказчика],
[fcsNotificationEF/purchaseResponsible/responsibleInfo/contactFax] as [Факс заказчика],
[fcsNotificationEF/purchaseResponsible/responsibleInfo/contactPerson/lastName] as [Фамилия ОЛ],
[fcsNotificationEF/purchaseResponsible/responsibleInfo/contactPerson/firstName] as [Имя ОЛ],
[fcsNotificationEF/purchaseResponsible/responsibleInfo/contactPerson/middleName] as [Отчество ЛО],
[fcsNotificationEF/purchaseResponsible/responsibleInfo/contactPerson/lastName]&’ ‘&[fcsNotificationEF/purchaseResponsible/responsibleInfo/contactPerson/firstName]&’ ‘&[fcsNotificationEF/purchaseResponsible/responsibleInfo/contactPerson/middleName] as [ФИО ответственного лица заказчика],
[fcsNotificationEF/purchaseResponsible/responsibleOrg/fullName] as [Заказчик],
[fcsNotificationEF/purchaseResponsible/responsibleOrg/postAddress] as [Почтовый адрес],
[fcsNotificationEF/purchaseResponsible/responsibleOrg/factAddress] as [Фактический адрес],
trim(subfield([fcsNotificationEF/purchaseResponsible/responsibleOrg/factAddress],’,’,3)) as [Область],
trim(subfield([fcsNotificationEF/purchaseResponsible/responsibleOrg/factAddress],’,’,4)) as [Город],
[fcsNotificationEF/purchaseResponsible/responsibleOrg/INN] as [ИНН заказчика],
[fcsNotificationEF/purchaseResponsible/responsibleOrg/KPP] as [КПП заказчика],
%Key_export_2C54E0F74D336CCA // Key for this table: export
FROM [C:\Users\padij_000\Desktop\123\fcsNotificationEA44*.xml] (XmlSimple, Table is [export]);
// End of [аукцион.xml] LOAD statements

Так и не понял как это сделать с помощью Инкрементальной загрузки.

и еще вопрос не могу понять как добавить в таблицу дополнительное поле которое берется не из исходных данных а добавляется самим qlikview.

A: для начала, ответ на второй вопрос.
Дополнительное поле формируется в операторе Load.
Например
Код:
temp1:
LOAD F1, F2, F1+F2 as F3 INLINE [
F1, F2
1, 2
4, 3
5, 6
3, 7
];
В исходной таблице только два поля F1 и F2, третье поле формируется в операторе load, в данном случае сумме двух полей F1,F2 назначено новое имя F3.

Q: Подскажите как можно в qlikview взять определенный текст из строки?
Нужно из адресов типа » Российская Федерация, 630007, Новосибирская обл, Новосибирск г, Колыванская, 104, — » взять только область в данном случае это «Новосибирская обл»

A: Как и в любом другом языке программирования в Qlikview & Sense присутствует целый набор функций для работы с текстовыми значениями.

Во вложении приведен вариант решения задачи (формула в нижней строке).
Описания функций можно найти по ссылке выше.
Если же адреса в этом поле имеют разные форматы, т.е. не последовательность «Страна, Индекс, Область, ..» а например — «Индекс, область,..», то придется проанализировать все варианты и прописывать условия на определение формата в котором записан адрес и соответствующее выражения для каждого случая.
В данном варианте мы:
вырезаем функций MID() из строки Adr,
начиная с позиции после второй запятой Index(Adr,’,’,2)+1,
подстроку между 2 и 3 запятыми Index(Adr,’,’,3)-Index(Adr,’,’,2)-1,
и результат дополнительно очищаем от крайних пробелов функцией TRIM()
Код:
trim(
mid(Adr,
Index(Adr,’,’,2)+1,
Index(Adr,’,’,3)-Index(Adr,’,’,2)-1
))

Q: Изначально имеется таблица событий: начало события, конец события …(№ оборудования — ключ, дата (дд.мм.гггг) — ключ).

К ней, с помощью left join сначала прицепляю одну таблицу по одному ключу, потом прицепляю еще 2 таблицы по двум другим (один появился только после предыдущей операции): по № и по дате (дд.мм.гггг).
Проблема в том, что если в изначальной таблице было несколько событий за Date для данного номера, то прицепляет он только одну запись:
Так то оно понятно, что так и должно быть. Но как можно эту проблему обойти?

На всякий случай код приложил.
Код:
Events:
LOAD hostid,
<...>,
Date(curtime) as Date
FROM [D:\QlickView\Data\Event.qvd] (qvd);

Left Join
LOAD hostid,
ATM,
<...>
FROM [D:\QlickView\Data\ATM_info.qvd] (qvd);

Left Join
LOAD
ATM,
Date,
TT_Created,
TT_Closed
Resident TT;
DROP Table TT;

Left Join
LOAD ATM,
Timestamp(NotEnabledFrom) as NotEnabledFrom,
Timestamp(NotEnabledTo) as NotEnabledTo,
Date(NotEnabledFrom) as Date
FROM [D:\QlickView\Data\NotEnabled.qvd] (qvd);
http://i024.radikal.ru/1504/64/40d2eddca2be.png
http://s017.radikal.ru/i437/1504/35/bb715dc4b652.png
A:
Не совсем уверен, что правильно понял проблему.
Вроде бы если в ТТ есть записи для ATM и Date , то TT_Created и TT_Closed должны быть заполнены значениями для одинаковых ATM и Date.
В качестве совета, попробуйте после каждого объединения выводить в промежуточный QVD, в целях отладки.
И дальнейшие связи делать уже с промежуточной таблицей,
т.е. примерно в такой последовательности.
1:
load
let join load
store into qvd
drop table 1;
load
left join
ну, и так далее.
Посмотрите результаты на каждом этапе, может что обнаружится неожиданное.

Q: Есть список где показывается 0 и 1, как их переименовать в списке, что бы показывалось. Да и Нет.

A: В списке есть возможность выбрать <выражение> вместо поля в самом низу.
И там уже написать что-то вроде : if(pole=1, ‘Да’, ‘Нет’)

Или, возможно, с точки зрения «красивости» и всякого прочего дизайна выгоднее создать 2 текстовых объекта «Да» / «Нет» и юзать всё многообразие настроек.
в них выбрать действие/выбор в поле/…

Q: Подскажите пожалуйста, почему не работает Order by?

Код:
// Загружаем данные
Товарные_запасы:
LOAD Товар,
Дата,
[Прогноз продаж],
[Товарные запасы]
FROM
[C:\Товарные_запасы.xlsx]
(ooxml, embedded labels, table is Лист3)
Order by Дата;

В таком же примере. где используется resident ____Таблица_____ Order by работает.
В чем может быть причина.

A: order by работает только с load resident.
Сначала грузим с файла, затем в памяти
noconcatenate
load
tra lalal

resident …
order by

Q: Уважаемы, подскажите пожалуйста, а как удалить Вкладки внутри скрипта?

A: В верхней панели:
Вкладка/удалить

Q: Как сделать перебор строк в таблице?

A: Перебор строк возможен, но не всегда это правильное решение, т.к. исполнение циклов занимает намного больше времени, чем SQL-запросы. Но встречаются ситуации, когда перебор является единственным разумным решением, например в теме про формирование переменных из таблицы
Код:
Variables:
LOAD * FROM
$(QVD_Path)Variables.qvd (qvd);

FOR i=0 to noofrows(‘Variables’)-1
LET var_name= peek(‘Variable_name’,i,’Variables’);
LET $(var_name) = peek(‘Variable_value’,i,’Variables’);
NEXT i
Использование переменных необходимо, т.к. мы не можем в Qlikview в рамках скрипта встать на какую-либо запись в загруженную таблицу,но мы можем обращаться к записям, по номеру строки и сохранять данные в переменные для дальнейшего использования.

Q: Доброго времени суток!

Похожую задачу я уже как-то озвучивал на форуме. Сейчас условие немного другое.
Имеется таблица событий следующего типа
time — начало события,
nexttime — конец события
diff — интервал в формате hh:mm:ss
start_dw -первый день недели рабочего времени
end_dw — последний день рабочего времни
start_time — начало раб.времени
end_time — конец раб. времени

Нужно посчитать разницу между time и nexttime в рабочее время.
Когда time и nexttime — один день, это легко, а вот если это разные дни? У меня даже идей нет…

A: Только сейчас кстати заметил, что раб день не нормирован.
Тогда меняем
networkdays(Time,NextTime)/3
на
networkdays(Time,NextTime)* (end_time-start_time)

Q: Каким образом загружать в скрипте только новую таблицу?

A: Модель данных формируется в процессе выполнения скрипта, связи строятся на последнем этапе после загрузки всех таблиц и добавить новую таблицу в уже существующую модель без повторного запуска скрипта невозможно.
Или вопрос касается загрузки измененных данных из источника, без повторной загрузки всех записей?

Q: Добрый день, ни как не могу стандартными средствами решить следующую задачку.
В сводную таблицу выводятся следующие данные, других просто нет. Получающийся результат на скриншоте ниже.

А мне нужно, чтобы получалось так.

Т.е. даты с 01.01.2015 по 11.01.2015 ставятся автоматически(так как между ними нет даты со значением),а вот значение во всех датах ставятся из даты 01.01.2015.

Копаю в сторону intervalmatch() но пока ни как не могу применить, что бы получился такой же результат.

Бужу благодарен любому совету, так как уже голову сломал.

A:Интервал тут не при чем.
Вам необходимо сформировать записи на даты между имеющимися значениями.
Смотрите по аналогии применение peek() в формировании записей на выходные дни для курсов валют


Найти решение у бизнес-партнера QlikTech (QlikView) в России.

Форум разработчиков QlikView и Qlik Sense. Получите ответы на все вопросы по QlikView и Qlik Sense!

Вы можете оставить комментарий, или ссылку на Ваш сайт.

Оставить комментарий

66 queries in 0,230 seconds
Website nonton bokep jepang