Форум разработчиков QlikView и Qlik Sense. Получи любые ответы на вопросы по QlikView и Qlik Sense в течении нескольких часов!
Вы не вошли.
Страницы 1
Добрый день! Мне очень нужна помощь.
Задача звучит просто, но как сделать пока не могу найти.
Задача:
Есть задания (tasks), есть логи изменения их состояний (task_logs)
Выглядит это допустим так:
Мы видим, что task1 (task_id=1) был 'создан'(created), 'назначен'(assigned) и 'взят в работу'(active) в неделю под номером W43.
А task2 был создан и назначен в W42, в W43 с ним ничего не происходило, поэтому нет ни одной записи за эту неделю о изменении его статуса, а в W44 он был решен и закрыт.
Мне же необходимо построить chart с грануляцией по неделям с информацией сколько же в каждую неделю было незакрытых task-ов(т.е. все задания в статусах не равных 'закрыт'). За W43 у меня есть записи в логах только по одному task-у, но 'незакрытых' task-ов должно посчитаться 2, а не 1.
Каким образом можно это сделать? в оракле я б использовала аналитические функции, а тут мне не хватает знаний.
Огромное спасибо за помощь! очень жду ваших советов
Неактивен
Добрый день!
Могу предложить вариант добавления недостающих строк в скрипте.
Идея такая:
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)
Неактивен
Александра, спасибо большое за ваш вариант!
Я тоже думала об этом, но увы, в моем случае мне такое мало подходит. Таблица с этими задачами велика, а в отчете нужна и дневная грануляция, т.е. мне придется добавлять для каждого пропущенного дня, а такие пропуски - нередкость, боюсь, что объем таблицы вырастет в разы. Надеюсь найти еще какой-нибудь способ, но если не найду, видимо придет "дополнять".
спасибо!
Неактивен
Ева, добрый день!
Если пользователи не будут иметь возможность фильтровать рассматриваемый период, то можно воспользоваться следующей формулой, предварительно отсортировав чарт по возрастанию недели:
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.
Поэтому если будет исправлять наименования формул, исправьте их в описании.
Неактивен
в скрипте:
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)
Неактивен
Страницы 1
[ Сгенерировано за 0.019 сек, 10 запросов выполнено - Использовано памяти: 1.51 Мбайт (Пик: 1.64 Мбайт) ]