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桌面中执行此操作?
答案 0 :(得分:2)
使用此表达式:
NewColumn =
CALCULATE(
MIN(
Table[datetime]),
FILTER(Table,Table[id]=EARLIER(Table[id])
)
)
在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
...
...
更新2:添加排名列。
要获得所需的排名,您可以使用以下表达式:
RankColumn =
RANKX(
CALCULATETABLE(Table,ALLEXCEPT(Table,Table[id]))
,Table[datetime]
,Hoja1[datetime]
,1
)
这是具有排名列的表:
如果有帮助,请告诉我。