Power BI Desktop 中 GROUP BY 的最小值

Evg*_*eny 1 group-by calculated-columns dax powerbi

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
Run Code Online (Sandbox Code Playgroud)

我想创建新列,该列将具有按 id 分组的每一行的最小日期时间值。

如何在 Power BI 桌面中使用 DAX 查询来完成此操作?

ale*_*eta 5

使用这个表达式:

NewColumn =
  CALCULATE(
    MIN(
      Table[datetime]),
      FILTER(Table,Table[id]=EARLIER(Table[id])
   )
  )
Run Code Online (Sandbox Code Playgroud)

在 Power BI 中使用包含数据的表,它将生成以下内容:

在此输入图像描述


更新:解释和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
            ...
            ...
Run Code Online (Sandbox Code Playgroud)

更新2:添加排名栏。

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

RankColumn = 
  RANKX(
    CALCULATETABLE(Table,ALLEXCEPT(Table,Table[id]))
    ,Table[datetime]
    ,Hoja1[datetime]
    ,1
 )  
Run Code Online (Sandbox Code Playgroud)

这是带有排名列的表:

在此输入图像描述

让我知道这是否有帮助。