2015-07-27 5 views
0

В идеале, я хотел бы рассчитать время цикла всего потока значений, представленного элементами отставания продукта в Visual Studio Online через Power BI. (Тогда я хотел бы получить время за статус, то есть, как долго он сидел в «новом» состоянии или как долго он застрял в состоянии «Committed».)Показать время работы рабочего цикла Visual Studio Online

Для начала я заинтересован используя расчетное значение, которое представляет время между created date и closed date товарного запаса продукта. После этого я хочу получить распределение найденных значений.

product backlog item time between created timestamp to closed timestamp 

Будет отправной точкой, но это, конечно, означает «очереди в минутах по названию».

Большинство других попыток привести:

Невозможно определить отношения между полями

Есть ли способ, чтобы получить некоторое представление о времени цикла?

ответ

1

Предполагая, что каждая строка имеет созданную дату и закрытую дату, вы можете использовать функцию длительности запроса мощности, чтобы получить разницу между двумя датами.

https://msdn.microsoft.com/en-us/library/mt296613.aspx

Обновление: Посмотрев в него (см мои комментарии ниже) Я понимаю, что это занимает несколько олимпийского уровня навыков запроса мощности для построения запроса вам нужно. Поэтому я создал его для вас :). Ниже приведен рабочий стол Power BI, но по какой-либо причине он не обновляется в PowerBI.com (я проверяю это). Чтобы сделать эту работу, вам нужно поместить свою учетную запись VSO и идентификатор запроса в запись ConnectionInfo.

Рекомендовать настройку альтернативных учетных данных, а не использовать BASIC auth.

Вы можете получить QueryID, сохраняя общий запрос к вашему ВС, а затем с помощью локона, чтобы получить идентификатор с помощью запроса:

//Replace YOURACCOUNT and YOURPROJECT with correct values below 
curl -u username:password https://YOURACCOUNT.visualstudio.com/DefaultCollection/YOURPROJECT/_apis/wit/queries?$depth=1&api-version=1.0 

Затем вы можете использовать следующий запрос (создать пустой запрос и пасты это в расширенный редактор в Power BI Desktop). Возможно, вам придется отрегулировать некоторые шаги, начиная с «workitems =», так как ваш запрос может иметь разные поля, чем у меня. Если вы вернете созданные, разрешенные и закрытые даты, расчеты продолжительности, которые я использовал, должны работать на вас. Вы установите аутентификацию на «Basic» при вызове в Power BI Desktop и укажите необходимые учетные данные.

let 
//TODO: replace YOURACCOUNT and YOURQUERYID below 
ConnectionInfo = [account = "YOURACCOUNT.visualstudio.com", queryID="YOURQUERYID"], 
account = Record.FieldValues(ConnectionInfo){0}, 
rootQuery = let 
    queryID = Record.FieldValues(ConnectionInfo){1}, 
    query = "https://" & account & "/DefaultCollection/PowerBIClients/_apis/wit/wiql/" & queryID, 
    Source = Json.Document(Web.Contents(query)) 
in 
    Source, 

#"INT-columns" = let 
    Source = rootQuery, 
    columns = Source[columns], 
    #"Converted to Table" = Table.FromList(columns, Splitter.SplitByNothing(), null, null, ExtraValues.Error), 
    #"Expanded Column1" = Table.ExpandRecordColumn(#"Converted to Table", "Column1", {"referenceName", "name", "url"}, {"referenceName", "name", "url"}) 
in 
    #"Expanded Column1", 

#"RAW-workitems" = let 
    Source = rootQuery, 
    workItems = Source[workItems], 
    #"Converted to Table" = Table.FromList(workItems, Splitter.SplitByNothing(), null, null, ExtraValues.Error), 
    #"Expanded Column1" = Table.ExpandRecordColumn(#"Converted to Table", "Column1", {"id", "url"}, {"id", "url"}) 
in 
    #"Expanded Column1", 

#"INT-columnClause" = let 
    Source = #"INT-columns", 
    colNames = Table.RemoveColumns(Source,{"name", "url"}), 
    list = Table.ToList(colNames), 
    joined = Text.Combine(list, ",") 
in 
    joined, 

#"INT-workitemsToGet" = let 
    Source = #"RAW-workitems", 
    col = Table.RemoveColumns(Source,{"url"}), 
    #"Changed Type" = Table.TransformColumnTypes(col,{{"id", type text}}), 
    list = Table.ToList(#"Changed Type"), 
    l = List.Count(list), 
    limits = List.Generate(()=>0, each _ < l, each _ + 100), 
    #"Converted to Table" = Table.FromList(limits, Splitter.SplitByNothing(), null, null, ExtraValues.Error), 
    #"Renamed Columns" = Table.RenameColumns(#"Converted to Table",{{"Column1", "iterations"}}), 
    #"Added Custom" = Table.AddColumn(#"Renamed Columns", "itemsToGet", each List.Range(list, [iterations], 100)), 
    #"Added Custom1" = Table.AddColumn(#"Added Custom", "itemsToGetString", each Text.Combine([itemsToGet], ",")), 
    #"Removed Columns" = Table.RemoveColumns(#"Added Custom1",{"iterations", "itemsToGet"}) 
in 
    #"Removed Columns", 

#"INT-workitemRequests" = let 
    Source = #"INT-workitemsToGet", 

    #"Added Custom" = Table.AddColumn(Source, "requests", each "https://" & account & "/DefaultCollection/_apis/wit/workitems?ids=" & [itemsToGetString] & "&fields=" & #"INT-columnClause"), 
    #"Removed Columns" = Table.RemoveColumns(#"Added Custom",{"itemsToGetString"}) 
in 
    #"Removed Columns", 

workitems = let 
    #"INT-workitemsRequests (2)" = let 
    Source = #"INT-workitemRequests", 
    results = Table.AddColumn(Source, "Results", each Json.Document(Web.Contents([requests]))), 
    out = 1 
in 
    results, 
    #"Removed Columns" = Table.RemoveColumns(#"INT-workitemsRequests (2)",{"requests"}), 
    #"Expanded Results" = Table.ExpandRecordColumn(#"Removed Columns", "Results", {"count", "value"}, {"Results.count", "Results.value"}), 
    #"Expanded Results.value" = Table.ExpandListColumn(#"Expanded Results", "Results.value"), 
    #"Expanded Results.value1" = Table.ExpandRecordColumn(#"Expanded Results.value", "Results.value", {"id", "fields", "url"}, {"Results.value.id", "Results.value.fields", "Results.value.url"}), 
    #"Expanded Results.value.fields" = Table.ExpandRecordColumn(#"Expanded Results.value1", "Results.value.fields", {"System.Id", "System.WorkItemType", "System.State", "System.AssignedTo", "System.CreatedDate", "System.Title", "Microsoft.VSTS.Common.ResolvedDate", "Microsoft.VSTS.Common.ClosedDate"}, {"System.Id", "System.WorkItemType", "System.State", "System.AssignedTo", "System.CreatedDate", "System.Title", "Microsoft.VSTS.Common.ResolvedDate", "Microsoft.VSTS.Common.ClosedDate"}), 
    #"Removed Columns1" = Table.RemoveColumns(#"Expanded Results.value.fields",{"Results.count", "Results.value.id"}), 
    #"Renamed Columns" = Table.RenameColumns(#"Removed Columns1",{{"Results.value.url", "WorkItemUrl"}}), 
    #"Changed Type" = Table.TransformColumnTypes(#"Renamed Columns",{{"Microsoft.VSTS.Common.ResolvedDate", type datetime}, {"Microsoft.VSTS.Common.ClosedDate", type datetime}, {"System.CreatedDate", type datetime}}), 
    #"Added Custom" = Table.AddColumn(#"Changed Type", "DurationToResolved", each Duration.TotalDays([Microsoft.VSTS.Common.ResolvedDate] - [System.CreatedDate])), 
    #"Added Custom1" = Table.AddColumn(#"Added Custom", "DurationToClosed", each Duration.TotalDays([Microsoft.VSTS.Common.ClosedDate] - [System.CreatedDate])), 
    #"Changed Type1" = Table.TransformColumnTypes(#"Added Custom1",{{"DurationToResolved", type number}, {"DurationToClosed", type number}}) 
in 
    #"Changed Type1"  

in workitems 
+0

Можно ли использовать его на веб-портале Power BI? – Fenton

+1

Вы бы сделали это в Power BI Desktop или в Excel 2013 с установленным Power Query. Поскольку вы упоминаете веб-портал Power BI, я предполагаю, что вы используете пакет Visual Studio Online Content в Power BI. Сейчас мы все еще работаем над планом подключения к VSO на PBI Desktop. Вам нужно будет получить данные по-другому, например, с извлечением данных из VSO (если это возможно), чтобы выполнить анализ, который вы хотите сделать. Функция продолжительности позволит вам выполнить расчет, который вам нужен, вам просто нужно получить данные там :). –

+0

Я только что проверил, и похоже, VSO имеет базовое auth для своих API-интерфейсов для отдыха. Я сам не пробовал, но вы должны иметь возможность использовать остальные API с базовым auth и веб-источником в Power BI Desktop. Получите данные, чтобы вытащить данные рабочего элемента. Вы захотите использовать «плоские» структуры запросов VSO для запроса запросов.Вам понадобится исключительно использовать GET-глаголы (поскольку в процессе запроса есть некоторые ограничения безопасности с помощью POST-глаголов). Для этого вам потребуется сохранить сохраненный запрос в VSO, из которого вы будете извлекать результаты. Дайте мне знать, если вы не можете заставить его работать. НТН –