使用整个表添加计算的自定义列以进行计算功率查询或dax

时间:2015-12-16 15:38:39

标签: dax powerbi powerquery

我在Power BI中有这个表,有关于某些对象的事件

| new_state | object_id | created_at |

| new | 1 | 11/4/2015 1:50:48 PM |

| in_use | 3 | 11/4/2015 2:31:10 PM |

| in_use | 1 | 11/4/2015 2:31:22 PM |

|删除| 2 | 11/4/2015 3:14:10 PM |

.....

我正在尝试在DAX或电源查询中添加计算列,以便对于每一行,我将拥有该对象的previous_state。从逻辑的角度来看,这并不困难:你按照id分组,对于那个组中的每一行,你寻找最接近的前一个时间并得到" new_state"这将代表该行的先前状态。 我试过通过在电源查询中创建一个函数并在自定义列中使用它来尝试这样做,但我得到了一个"循环引用检测到"错误,不能这样做。对解决方案的任何想法

3 个答案:

答案 0 :(得分:1)

今天在Power Query中很难表达行之间的比较。大多数函数假设表只是一组无序的行。

要扩展Oğuz的注释,您可以添加一个索引列,然后将一个PreviousState索引列添加到上一行(或null)。作为优化,如果首先缓冲整个表,它可能会快得多。

{{1}}

答案 1 :(得分:0)

肯定有比这更简洁的解决方案,但在DAX中你可以创建一个计算列(prevdate)来存储上一个条目的日期时间:

cor

然后添加另一个计算列以存储上一次的状态:

inter

答案 2 :(得分:0)

我已经解决了它:D

#"Sorted Rows" = Table.Sort(#"Reordered Columns",{{"object_id", Order.Ascending}, {"created_at", Order.Ascending}}),
#"Added Index" = Table.AddIndexColumn(#"Sorted Rows", "Index", 0, 1),
Buffer = Table.Buffer(#"Added Index"),
#"Added Custom" = Table.AddColumn(Buffer, "PreviousState", each try (if Buffer{[Index] - 1}[object_id]=Buffer{[Index]}[object_id] then Buffer{[Index] - 1}[new_state] else null ) otherwise null)

我不确定它大部分都不是黑客,但似乎有效。您是否看到将来可能失败的任何一点?