Power BI Desktop

时间:2016-07-25 14:41:21

标签: group-by calculated-columns powerbi dax

id  datetime             new_column           datetime_rankx
1   12.01.2015 18:10:10  12.01.2015 18:10:10  1
2   03.12.2014 14:44:57  03.12.2014 14:44:57  1
2   21.11.2015 11:11:11  03.12.2014 14:44:57  2
3   01.01.2011 12:12:12  01.01.2011 12:12:12  1
3   02.02.2012 13:13:13  01.01.2011 12:12:12  2
3   03.03.2013 14:14:14  01.01.2011 12:12:12  3

我想创建一个新列,它将按ID的每一行的最小日期时间值。

如何使用DAX查询在Power BI桌面中执行此操作?

1 个答案:

答案 0 :(得分:2)

使用此表达式:

NewColumn =
  CALCULATE(
    MIN(
      Table[datetime]),
      FILTER(Table,Table[id]=EARLIER(Table[id])
   )
  )

在Power BI中使用包含数据的表格,它将产生以下结果:

enter image description here

更新:说明和EARLIER功能使用。

基本上,EARLIER函数可以让您访问不同行上下文的值。

当你使用CALCULATE函数时,它会创建整个表的行上下文,理论上它会迭代每个表行。使用FILTER函数时也会发生同样的情况,它将遍历整个表并根据过滤条件评估每一行。

到目前为止,我们有两个行上下文,CALCULATE创建的行上下文和FILTER创建的行上下文。注意FILTER使用EARLIER来访问CALCULATE的行上下文。话虽如此,在我们的情况下,对于外部的每一行(CALCULATE的行上下文),FILTER返回一组行,这些行对应于外部上下文中的当前id

如果你有编程背景,它可以给你一些感觉。它类似于嵌套循环。

希望这个Python代码指出这背后的主要思想:

outer_context = ['row1','row2','row3','row4']
inner_context = ['row1','row2','row3','row4'] 

for outer_row in outer_context:
    for inner_row in inner_context:
        if inner_row == outer_row: #this line is what the FILTER and EARLIER do

            #Calculate the min datetime using the filtered rows
            ...
            ...

更新2:添加排名列。

要获得所需的排名,您可以使用以下表达式:

RankColumn = 
  RANKX(
    CALCULATETABLE(Table,ALLEXCEPT(Table,Table[id]))
    ,Table[datetime]
    ,Hoja1[datetime]
    ,1
 )  

这是具有排名列的表:

enter image description here

如果有帮助,请告诉我。