具有多个 TOPN 循环的 PowerBI 复杂计算列
PowerBI Complex Calculated Column with multiple TOPN loops
使用下面的信息,我需要在 DAX 中创建一个名为 Table 的新 table。
我的问题是“新值”列的以下措施仅返回 saleID 的 TOPN 审计记录(只要审计记录可以包含“更改日期”和“有效日期”之间的销售日期直到“日期”。)。应调整此过滤器以仅检测“更改日期”是否发生在“销售日期”当天或之后。 “有效期至”列不应计入此计算。
new value =
VAR CurrentContractDate = [Sale Date]
RETURN
VAR RespEmp =
TOPN (
1,
DynamicsAudit,
IF (
CurrentContractDate <= DynamicsAudit[Valid Until]
&& CurrentContractDate >= DynamicsAudit[Changed Date], //Check, whether there is matching date
DATEDIFF ( DynamicsAudit[Changed Date], DynamicsAudit[Valid Until], DAY ), //If so, rank matching locations (you may want to employ a different formula)
MIN ( //If the location is not matching, calculate how close it is (from both start and end date)
ABS ( DATEDIFF ( CurrentContractDate, DynamicsAudit[Changed Date], DAY ) ),
ABS ( DATEDIFF ( CurrentContractDate, DynamicsAudit[Valid Until], DAY ) )
) + 1000000 //Add a discriminating factor in case there are matching rows that should be favoured over non-matching.
), 1
)
RETURN
SELECTCOLUMNS( RespEmp,"ResponsibleEmployee", [new value] )
那么这么复杂的过滤器长什么样子呢?
new value =
VAR sale = [SaleID]
VAR saleDate = [Sale Date]
VAR tbl = SUMMARIZE(FILTER(DynamicsAudit, DynamicsAudit[SaleID] = sale && DynamicsAudit[Changed Date] >= saleDate),DynamicsAudit[new value])
VAR tbl2 = NATURALINNERJOIN(
FILTER(DbEmployees, DbEmployees[StartDate]<=saleDate && DbEmployees[EndDate] >= saleDate),
CALCULATETABLE(DynamicsContacts, TREATAS(tbl, DynamicsContacts[EmployeeID])))
RETURN MAXX(TOPN(1,tbl2, IF(DbEmployees[Position] = "clerk", 1,2), ASC), DynamicsContacts[EmployeeID])
第一个 table 表达式为您提供符合条件的员工列表。
第二个 table 表达式加入了员工(由销售日期期间合同有效的人过滤)和联系人(由符合条件的人过滤)
最后做一个 Top 1,它首先选择文员,然后选择经理。
使用下面的信息,我需要在 DAX 中创建一个名为 Table 的新 table。
我的问题是“新值”列的以下措施仅返回 saleID 的 TOPN 审计记录(只要审计记录可以包含“更改日期”和“有效日期”之间的销售日期直到“日期”。)。应调整此过滤器以仅检测“更改日期”是否发生在“销售日期”当天或之后。 “有效期至”列不应计入此计算。
new value =
VAR CurrentContractDate = [Sale Date]
RETURN
VAR RespEmp =
TOPN (
1,
DynamicsAudit,
IF (
CurrentContractDate <= DynamicsAudit[Valid Until]
&& CurrentContractDate >= DynamicsAudit[Changed Date], //Check, whether there is matching date
DATEDIFF ( DynamicsAudit[Changed Date], DynamicsAudit[Valid Until], DAY ), //If so, rank matching locations (you may want to employ a different formula)
MIN ( //If the location is not matching, calculate how close it is (from both start and end date)
ABS ( DATEDIFF ( CurrentContractDate, DynamicsAudit[Changed Date], DAY ) ),
ABS ( DATEDIFF ( CurrentContractDate, DynamicsAudit[Valid Until], DAY ) )
) + 1000000 //Add a discriminating factor in case there are matching rows that should be favoured over non-matching.
), 1
)
RETURN
SELECTCOLUMNS( RespEmp,"ResponsibleEmployee", [new value] )
那么这么复杂的过滤器长什么样子呢?
new value =
VAR sale = [SaleID]
VAR saleDate = [Sale Date]
VAR tbl = SUMMARIZE(FILTER(DynamicsAudit, DynamicsAudit[SaleID] = sale && DynamicsAudit[Changed Date] >= saleDate),DynamicsAudit[new value])
VAR tbl2 = NATURALINNERJOIN(
FILTER(DbEmployees, DbEmployees[StartDate]<=saleDate && DbEmployees[EndDate] >= saleDate),
CALCULATETABLE(DynamicsContacts, TREATAS(tbl, DynamicsContacts[EmployeeID])))
RETURN MAXX(TOPN(1,tbl2, IF(DbEmployees[Position] = "clerk", 1,2), ASC), DynamicsContacts[EmployeeID])
第一个 table 表达式为您提供符合条件的员工列表。
第二个 table 表达式加入了员工(由销售日期期间合同有效的人过滤)和联系人(由符合条件的人过滤)
最后做一个 Top 1,它首先选择文员,然后选择经理。