В сценарии:
С помощью приведенного ниже скрипта в таблицу Process
будет добавлено новое поле — NetWorkingDays
. В этом поле будут указаны рабочие дни для каждого проекта (Id
). С этим полем в наборе данных будет легче вычислить среднее значение в пользовательском интерфейсе (что-то вроде sum(NetWorkingDays) / count(distinct Id)
Process:
Load * Inline [
Id, Name , CretedOn
1, Process1, 2019-04-02
2, Process2, 2019-04-05
3, Process3, 2019-05-02
4, Process4, 2019-06-02
];
ProcessHistory:
Load
Id as ProcessHistoryId,
ProcessId as Id,
Status,
CreatedOn as ProcessHistoryCreatedOn
;
Load * Inline [
Id, ProcessId, Status , CreatedOn
1, 1, Status 1, 2019-04-02
2, 1, Status 2, 2019-04-02
3, 1, Status 3, 2019-04-04
4, 2, Status 1, 2019-04-05
5, 2, Status 3, 2019-04-06
6, 3, Status 1, 2019-05-07
7, 3, Status 3, 2019-05-09
8, 4, Status 1, 2019-06-02
9, 4, Status 2, 2019-06-04
10, 4, Status 3, 2019-06-07
];
TempTable:
Load
Id,
min(CretedOn) as MinCreatedOn
Resident
Process
Group By
Id
;
join (TempTable)
Load
Id,
max(ProcessHistoryCreatedOn) as MaxCreatedOn
Resident
ProcessHistory
Where
Status = 'Status 3'
Group By
Id
;
NetWorkingDaysData:
Load
Id,
NetWorkDays(MinCreatedOn, MaxCreatedOn) as NetWorkingDays
Resident
TempTable
;
Drop Table TempTable;
Последняя часть скрипта (изнутри):
Создайте временную таблицу для вычисления min(CreatedOn)
из таблицы Process
и max(ProcessHistoryCreatedOn)
из таблицы ProcessHistory
. ProcessHistory
также фильтруется, чтобы включить только записи, где Status = 'Status 3'
(обе таблицы агрегированы по Id
)
TempTable:
Load
Id,
min(CretedOn) as MinCreatedOn
Resident
Process
Group By
Id
;
join (TempTable)
Load
Id,
max(ProcessHistoryCreatedOn) as MaxCreatedOn
Resident
ProcessHistory
Where
Status = 'Status 3'
Group By
Id
;
После создания временной таблицы мы можем создать окончательную таблицу, в которой мы будем рассчитывать количество чистых рабочих дней, используя NetWorkDays. В таблице NetWorkingDaysData
будет всего два поля — Id
и NetWorkingDays
NetWorkingDaysData:
Load
Id,
NetWorkDays(MinCreatedOn, MaxCreatedOn) as NetWorkingDays
Resident
TempTable
;
И последний шаг — удалить TempTable
— он больше не нужен.
В пользовательском интерфейсе:
Тот же результат может быть достигнут в пользовательском интерфейсе с помощью приведенного ниже выражения. Просто имейте в виду, что подход с пользовательским интерфейсом может привести к более высокому потреблению ресурсов! Поскольку все расчеты выполняются на лету (зависит от того, насколько велик ваш набор данных).
avg(
Aggr(
NetWorkDays( min(ProcessHistoryCreatedOn) , max( {< Status = {'Status 3'} >} ProcessHistoryCreatedOn) )
, Id)
)
person
Stefan Stoichev
schedule
24.06.2019