Календарь для приложений QLIKVIEW и Qlik Sense

Автор admin, 18 декабря 2012, 10:29:25

« назад - далее »

admin

Одним из первых вопросов, с которыми сталкивается новичок в Qlikview - анализ по датам, и прочим календарным измерениям.
Вопрос решается просто.
необходимо построить таблицу, содержащую записи на каждую дату, соответствующую календарному периоду анализируемого источника.
Начальная и конечная дата может быть задана переменными в сценарии, т.е. жестко в приложении.
Либо вычисляться через запрос к источнику данных.

Привожу пример для первого варианта:
//Формирование массива дат по вычисленным пределам
let vDate_start=MakeDate(2003,1,1);
LET Start = floor(vDate_start);
LET End = floor(YearEnd(AddMonths(today(),12)));
LET NumOfDays = End - Start + 1;
Date_src:
LOAD
$(Start) + Rowno() -1 as DateId
AUTOGENERATE $(NumOfDays); //массив дат в числовом формате


//Непосредственно календарь
Calendar:
LOAD
DateId,
year(DateId) as 'год',
dual('Кв.' & ceil(month(DateId)/3),ceil(month(DateId)/3)) as 'квартал',
dual('Кв.' & ceil(month(DateId)/3) & '-' & year(DateId),year(DateId) & ceil(month(DateId)/3)) as 'квартал-год',
month(DateId) as 'месяц',
ceil(month(DateId)) as 'месяц номер',
dual(month(DateId) & '-' & year(DateId),year(DateId) & num(month(DateId), '00')) as 'месяц-год',
week(DateId) as 'неделя',
weekday(DateId) as 'день недели',
date(DateId) as 'дата',
day(DateId) as 'день'
RESIDENT Date_src;
Drop Table Date_src;

admin

#1
Пример формирования календаря на основе исследуемых данных:
Dates:
LOAD * INLINE [
    F1
    01.03.2014
    01.01.2014
    31.12.2014
    01.03.2015
];

tmp1:
LOAD min(F1) as 'DateStart', max(F1) as 'DateEnd' Resident Dates ;

LET Date_Start = peek('DateStart',0,'tmp1');
LET Date_End = peek('DateEnd',0,'tmp1');
LET vStart = floor(Date_Start);
LET vEnd = floor(Date_End);
LET vNumOfDays = vEnd - vStart + 1;
DROP Table tmp1;

Date_src:
LOAD $(vStart) + Rowno() -1 as DateId AUTOGENERATE $(vNumOfDays); //массив дат в числовом формате

//Непосредственно календарь
Calendar:
LOAD
DateId,
year(DateId) as 'год',
dual('Кв.' & ceil(month(DateId)/3),ceil(month(DateId)/3)) as 'квартал',
dual('Кв.' & ceil(month(DateId)/3) & '-' & year(DateId),year(DateId) & ceil(month(DateId)/3)) as 'квартал-год',
month(DateId) as 'месяц',
ceil(month(DateId)) as 'месяц номер',
dual(month(DateId) & '-' & year(DateId),year(DateId) & num(month(DateId), '00')) as 'месяц-год',
week(DateId) as 'неделя',
weekday(DateId) as 'день недели',
date(DateId) as 'дата',
day(DateId) as 'день'
RESIDENT Date_src;
Drop Table Date_src;

admin

#2
Вариант формирования календаря через функцию.
Источник - http://community.qlik.com/docs/DOC-5773

mutniyglaz

Не совсем понятно, как все таки построить календарь в QlikView )

mutniyglaz

Календарь надо загружать из Excel?

admin

#5
(Для понимания изложенного ниже материала рекомендую открыть Qlikview или Sense и создав новое приложение пошагово изучить работу описанного ниже процесса получения данных по курсу валют с календарем)

Календарь - таблица с колонками, необходимыми для вашей задачи.
Например, если вас интересует только динамика по дням и никаких вычислений в разрезе других календарных измерений не требуется, то и смысла в календаре мало.
Но если необходимо производить фильтрацию по годам, месяцам и пр. то необходимо сделать таблицу, с вычисленными календарными измерениями (год, квартал и т.д.).
Например, вы хотите провести анализ по динамике курса валюты и расчет среднего курса на каждый месяц.
Берем код отсюда.
Вставляем в сценарий своего приложения и правим даты по своему требованию.
Например

//Вычисляем переменные для вставки в сторке параметров
let vDateStart = date('01.01.2015','DD/MM/YYYY');
let vDateEnd = date(today(),'DD/MM/YYYY');
//Строка параметров
set vURLHist='http://www.cbr.ru/scripts/XML_dynamic.asp?date_req1=$(vDateStart)&date_req2=$(vDateEnd)&VAL_NM_RQ=';
//Код валюты
set vVALID='R01235';

//Грузим курсы валют
TmpRate:
LOAD Date,Id,Nominal,Value
FROM [$(vURLHist)$(vVALID)] (XmlSimple, Table is [ValCurs/Record]);

//Определяем границы периода, т.к. они могут отличаться от заданной установки в запросе
TmpDate:
Load Min(Date) as MinD, Max(Date) as MaxD resident TmpRate;
// Переносим значения из таблицы в переменную
Let vMinD = Peek('MinD',-1,'TmpDate')-1;
Let vMaxD = Peek('MaxD',-1,'TmpDate');
// Удаляем временную таблицу с границами периода
Drop Table TmpDate;
//Устанавливаем связь с таблицей из одного поля Date, но со всеми датам в диапазоне vMaxDate, vMinDate
Join (TmpRate) Load Date(recno()+$(vMinD)) as Date Autogenerate vMaxD-vMinD;
// Здесь мы получаем таблицу, на все даты, но для некоторых дат значения полей Id,Nominal,Value отсутствуют
//Далее мы заполняем пустые значения данными за предыдущий день
КурсыВалют:
NoConcatenate Load Date as Дата,
If(IsNull(Id), Peek(Id), Id) as Id,
If(IsNull(Nominal), Peek(Nominal), Nominal) as Nominal,
if(IsNull(Value), Peek(Value), Value) as Value
Resident TmpRate
Order By Date ;
DROP Table TmpRate;
// В итоге получаем таблицу с курсом валюты на каждый день

Далее, обратите внимание, что границы периода уже заданы нами же в переменных, следовательно определять границы дат запросами не имеет смысла.
Поэтому мы просто :

//Вычисляем требуемое количество записей для календаря
LET NumOfDays = vMaxD-vMinD+1;
//Формируем таблицу с числовыми значениями дат на весь период
tmp_Date:
LOAD $(vMinD) + Rowno() -1 as DateId AUTOGENERATE $(NumOfDays);

На этом этапе мы получили таблицу с одним полем и числом записей, равным числу дней периода.
И нам теперь предстоит каждое числовое значение даты обработать календарными функциями и получить массив дат и соответствующих измерений:
//Формируем сам календарь, где каждое числовое значение даты обрабатывается календарными функциями для полчения необходимого значения.
Календарь:
LOAD
DateId,
year(DateId) as 'Год',
month(DateId) as 'Месяц',
ceil(month(DateId)) as 'Месяц номер',
dual(month(DateId) & '-' & year(DateId),year(DateId) & num(month(DateId), '00')) as 'Месяц-год',
date(DateId) as 'Дата'
RESIDENT tmp_Date;
//Удаляем временную таблицу
Drop Table tmp_Date;

Все функции подробно описаны на сайте help.qlik.com
Функции даты и времени

Для понимания принципов работы скрипта скопируйте блоки в один сценарий поочередно и на каждом этапе проверяйте результат, так легче понимать работу программы, на любом языке.
И в завершении, все на тему календарей в Qlik-сообществе

Отличная статья в блоге о Qlikview (Внимание! Файлы, предлагаемые для скачивания по ссылке не предназначены для просмотра в персональной версии.)

RinatG

Отличный инструмент.
Осталось только понять логику применения когда есть база с несколькими полями дат. Ведь кликвью не допускает в одной таблице несколько полей с одним наименованием?! Правильно ли я понимаю, что мне придется разбить исходную базу и загрузить ее столько раз сколько полей с датами у меня есть для возможности представления различных данных в единицах временного периода в соответствие с календарем?

Яндекс.Метрика