用于将优先任务分组到冲刺中的计算列或度量

Calculated Column or Measure for grouping prioritized tasks into sprints

我有按优先级排序的任务相关数据以及我想分组到冲刺中的相应故事点。我可以计算累积积分。但是,我正在努力创建一个度量(甚至计算列)来预测在给定已知速度的情况下任务将在哪个冲刺中发生。

假设 'Velocity' = 10

enter image description here

我的目标是确定 table 图像中显示的预测冲刺。基本上,冲刺的故事点总和不能超过速度。不幸的是,简单地将 Cumulative Points 除以 Velocity 和四舍五入是行不通的。在这种情况下,第 11 个任务将落入 sprint 3,但 sprint 的总故事点将超过速度。

我已经查看了 Greg Deckler 的 For/While solution,但我无法让它解决这个问题。我是 DAX 的新手,但我确实尝试了各种其他选项,但找不到解决方案。

如果您的预测冲刺次数有限,您可以采用以下解决方案:

(我的table叫:Plan)

  1. 使用以下 DAX 语法创建一个列:

S1 = IF(SUMX(FILTER(Plan, Plan[Priority] <= EARLIER(Plan[Priority])), Plan[Story Points]) > 10, 0, SUMX(FILTER(Plan, Plan[Priority] <= EARLIER(Plan[Priority])), Plan[Story Points]))

S1 将 return Sprint 1 中每个条目的累积值。

  1. 根据您要预测的冲刺次数创建 n 个计算 measures/column。 (这是此解决方案的坏处,因为它无法扩展):

S2 = IF(SUMX(FILTER(Plan, Plan[S1] = 0 && Plan[Priority] <= EARLIER(Plan[Priority])), Plan[Story Points]) > 10, 0, SUMX(FILTER(Plan, Plan[S1] = 0 && Plan[Priority] <= EARLIER(Plan[Priority])), Plan[Story Points]))

S3 = IF(SUMX(FILTER(Plan, Plan[S2] = 0 && Plan[S1] = 0 && Plan[Priority] <= EARLIER(Plan[Priority])), Plan[Story Points]) > 10, 0, SUMX(FILTER(Plan, Plan[S1] = 0 && Plan[S2] = 0 && Plan[Priority] <= EARLIER(Plan[Priority])), Plan[Story Points]))

S4 = IF(SUMX(FILTER(Plan, Plan[S2] = 0 && Plan[S3] = 0 && Plan[S1] = 0 && Plan[Priority] <= EARLIER(Plan[Priority])), Plan[Story Points]) > 10, 0, SUMX(FILTER(Plan, Plan[S1] = 0 && Plan[S2] = 0 && Plan[S3] = 0 && Plan[Priority] <= EARLIER(Plan[Priority])), Plan[Story Points]))

  1. 创建一个新度量,returns 与 S1-S4 计算度量相关的字符串:

Sprint = IF(Plan[S1] > 0, 1, IF(Plan[S2] > 0, 2, IF(Plan[S3] > 0, 3, IF(Plan[S4] > 0, 4))))

  1. 继续隐藏 S1-S4 列...

如果您要预测的 sprint 数量有限,这可能是可行的方法...

希望对您有所帮助!

您可以使用 Floor 函数解决您的问题。

在 Dax 中,我创建了一个计算列:

Sprint.Forecast = FLOOR(SheetName[cumulative.points],10)/10+1

也可以在 excel 中使用 floor 函数来完成。假设 Cumulative Points 列在 C 中,您可以通过获取预测列 =FLOOR(C2,10)/10+1

我会使用 Power Query / M 语言来完成此操作。

let
    Source = Table.FromColumns({
        {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13},
        {2, 5, 1, 3, 1, 3, 1, 7, 2, 1, 1, 5, 3}
    }, type table [Priority = Int32.Type, Story Point = Int32.Type]),
    Velocity = 10,
    AddedSprint = Table.FromRecords(
        List.Accumulate(
            Table.ToRecords(Table.Sort(Source, "Priority")),
            [TotalSP = 0, CurrentSprint = 1, Value = {}],
            (state as record, record as record) as record =>
                let sp = record[Story Point],
                    nextState =
                        if state[TotalSP] + sp > Velocity then [
                            TotalSP = sp,
                            CurrentSprint = state[CurrentSprint] + 1,
                            Value = state[Value] & {record & [Sprint = CurrentSprint]}
                        ]
                        else [
                            TotalSP = state[TotalSP] + sp,
                            CurrentSprint = state[CurrentSprint],
                            Value = state[Value] & {record & [Sprint = CurrentSprint]}
                        ]
                in nextState
        )[Value]
    )
in
    AddedSprint