Power BI Desktop 中 GROUP BY 的最小值

Min value with GROUP BY in Power BI Desktop

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 桌面中执行此操作?

使用这个表达式:

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

在 Power BI 中使用 table 和你的数据会产生这样的结果:


更新: 说明和 EARLIER 函数用法。

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

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

到目前为止,我们有两个行上下文,CALCULATE 创建的行上下文和 FILTER 创建的行上下文。注意 FILTER 使用 EARLIER 来访问 CALCULATE 的行上下文。话虽如此,在我们的例子中,对于外部(CALCULATE 的行上下文)中的每一行,FILTER returns 一组行对应于外部上下文中的当前 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
 )  

这是 table 排名列:

如果有帮助请告诉我。