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

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

Вы не вошли.

Готовые решения на платйорме QlikView

#1 2015-10-30 13:37:44

Ева Слуцкая
Участник
Зарегистрирован: 2015-10-29
Сообщений: 2
Windows 7Chrome 46.0.2490.80

Необходимость в аналитических функциях

Добрый день! Мне очень нужна помощь.
Задача звучит просто, но как сделать пока не могу найти.

Задача:
Есть задания (tasks), есть логи изменения их состояний (task_logs)
Выглядит это допустим так:
fjBOLKaDeQw.jpg

Мы видим, что task1 (task_id=1) был 'создан'(created), 'назначен'(assigned) и 'взят в работу'(active) в неделю под номером W43.
А task2 был создан и назначен в W42, в W43 с ним ничего не происходило, поэтому нет ни одной записи за эту неделю о изменении его статуса, а в W44 он был решен и закрыт.

Мне же необходимо построить chart с грануляцией по неделям с информацией сколько же в каждую неделю было незакрытых task-ов(т.е. все задания в статусах не равных 'закрыт'). За W43 у меня есть записи в логах только по одному task-у, но 'незакрытых' task-ов должно посчитаться 2, а не 1.

Каким образом можно это сделать? в оракле я б использовала аналитические функции, а тут мне не хватает знаний.

Огромное спасибо за помощь! очень жду ваших советов

Неактивен

#2 2015-10-30 16:52:11

Alexandra Sevastyanova
Участник
Зарегистрирован: 2015-02-17
Сообщений: 2
Windows 7Firefox 41.0

Re: Необходимость в аналитических функциях

Добрый день!

Могу предложить вариант добавления недостающих строк в скрипте.

Идея такая:

1. Находим задачи, у которых есть разрывы между неделями больше чем на одну
2. Высчитываем дельту разрыва
3. Добавляем строки по неделям, которых нехватает с последним из установленных статусов задачи.

Вот небольшой пример кода:

Task_Logs:
Load
	TaskID
	, Status
	, week
	, If(Status = 'closed', 1, 0) as ?ClosedTask
	;
Load * Inline [
	TaskID, Status, week
	1, assigned, 43
	1, active, 43
	1, assigned, 43
	1, created, 43
	1, closed, 47 
	2, closed, 44
	2, resolved, 44
	2, active, 42
	2, assigned, 42
	2, created, 42
	];


// определяем разрывы в неделях
Task_LogsFinal:
Load
	TaskID
	, Status
	, week
	, ?ClosedTask
	, If(Previous(TaskID) = TaskID and Previous(week) - week > 1, Previous(week) - week, 0) as delta
Resident Task_Logs
Order by
	TaskID
	, week
desc
;

Drop Table Task_Logs;

// берем только те строки, после которых есть разрыв
Task_LogsWithDelta:
Load
	TaskID
	, Status
	, week
	, delta
Resident Task_LogsFinal
Where
	?ClosedTask = 0
	and delta > 0
;


// добавляем каждой строке каждую неделю
join(Task_LogsWithDelta)
Load * Inline [
	weekAdd
	42
	43
	44
	45
	46
	47
	];


// отбираем необходимы строки и добавляем в нашу таблицу
Concatenate(Task_LogsFinal)
Load
	TaskID
	, Status
	, weekAdd as week
Resident Task_LogsWithDelta
Where
	weekAdd - week < delta
	and weekAdd - week > 0
;

Drop Table Task_LogsWithDelta;

А вот финальная таблица:
Status    TaskID    week
active    1    43
assigned    1    43
created    1    43
assigned    1    44
assigned    1    45
assigned    1    46
closed    1    47
active    2    42
assigned    2    42
created    2    42
active    2    43
closed    2    44
resolved    2    44

Редактировался Alexandra Sevastyanova (2015-10-30 16:52:41)

Неактивен

#3 2015-10-30 23:03:46

Ева Слуцкая
Участник
Зарегистрирован: 2015-10-29
Сообщений: 2
Windows 7Chrome 46.0.2490.80

Re: Необходимость в аналитических функциях

Александра, спасибо большое за ваш вариант!

Я тоже думала об этом, но увы, в моем случае мне такое мало подходит. Таблица с этими задачами велика, а в отчете нужна и дневная грануляция, т.е. мне придется добавлять для каждого пропущенного дня, а такие пропуски - нередкость, боюсь, что объем таблицы вырастет в разы. Надеюсь найти еще какой-нибудь способ, но если не найду, видимо придет "дополнять".

спасибо!

Неактивен

#4 2015-11-02 16:19:38

Nick Riga
Участник
Зарегистрирован: 2015-02-17
Сообщений: 13
Windows 7Firefox 41.0

Re: Необходимость в аналитических функциях

Ева, добрый день!

Если пользователи не будут иметь возможность фильтровать рассматриваемый период, то можно воспользоваться следующей формулой, предварительно отсортировав чарт по возрастанию недели:
Label: Not closed
Definition: Count({<STATUS={'created'}>}DISTINCT TASK_ID) - Count({<STATUS={'closed'}>}DISTINCT TASK_ID) + alt( Above( [Not closed] ) , 0 )
- она считает разницу между количеством созданных и количеством закрытых тасков на этой неделе и прибавляет предыдущее значение из этого же столбца- то есть считает накопительным итогом.
Таким образом для каждой недели будет считаться количество (созданных-закрытых) задач с минимальной даты по конец этой недели.

В случае если пользователь имеет возможность ограничивать период, необходимо добавить ещё две формулы:
Label: Not closed earlier
Definition: Count({<STATUS= {'created'}, LOG_ID= {"<$(=min(LOG_ID))"}, WEEK>}DISTINCT TOTAL TASK_ID) -
Count({<STATUS= {'closed'}, LOG_ID= {"<$(=min(LOG_ID))"}, WEEK>}DISTINCT TOTAL TASK_ID)
- считает количество незакрытых задач, до отфильтрованного периода;

Label: Not closed total
Definition: [Not closed] + [Not closed earlier]
- считает количество незакрытых задач итого.

В qlikview при написании expressions есть возможность использовать другие формулы из этого же чарта обращаясь к ним по Label.
Поэтому если будет исправлять наименования формул, исправьте их в описании.

Неактивен

#5 2016-03-21 14:02:49

Roman
Участник
Зарегистрирован: 2016-03-21
Сообщений: 4
LinuxChrome 48.0.2564.109

Re: Необходимость в аналитических функциях

в скрипте:

Join(task_logs)
LOAD task_id, num(min(log_updated_at)) as minDate, num(max(log_updated_at)) as maxDate
Resident task_logs
Where match(status,'closed')=0
group by task_id;

calendar:
LOAD         
       num(TempDate) as Дата,
       Year(TempDate)&'-W'&Week(TempDate) as Неделя;
LOAD date ($(varMinDate) + rowno() - 1)      as TempDate
AUTOGENERATE $(varMaxDate) - $(varMinDate) + 1;

в выражении сводной таблицы:

count({< minDate = {"<=$(=max(Дата)"},maxDate = {">=$(=min(Дата)"} >} distinct task_id)

при этом выборка недель происходит из столбца Неделя таблицы calendar, столбец week таблицы task_logs можно исключить.

Редактировался Roman (2016-03-21 14:06:52)

Неактивен

Сейчас в этой теме форумчан: 0, гостей: 1
[Bot] CCBot

Подвал форума

Под управлением FluxBB
Модифицировал Visman

[ Сгенерировано за 0.014 сек, 10 запросов выполнено - Использовано памяти: 1.63 Мбайт (Пик: 1.72 Мбайт) ]