LOOKUPVALUE函数用于根据一个或多个搜索条件,从另一个表中获取一个或0个值。LOOKUPVALUE运行在行上下文中,根据当前表中的当前行,从另一个表中查找条件相等的行,查找不需要两个表之间存在关系,搜索结果也不受过滤条件的影响。当两个表之间存在关系时,考虑使用RELATED函数,因为RELATED函数查询性能更快。 LOOKUPVALUE( <result_columnName>, <search_columnName>, <search_value> [, <search2_columnName>, <search2_value>]… [, <alternateResult>] ) 参数注释:
返回值:
引擎内部在执行LOOKUPVALUE函数时会生成一个等效的查询: VAR SearchValue = <Search_Value> RETURN CALCULATE ( SELECTEDVALUE ( <Result_ColumnName>, <Alternate_Result> ), FILTER ( ALLNOBLANKROW ( <Search_ColumnName> ), <Search_ColumnName> == SearchValue -- The == operator distinguishes between blank and 0/empty string ), ALL ( <table_of_Result_ColumnName> ) -- If Result_ColumnName is t[c], this is ALL ( t ) ) 一,用RELATED代替LOOKUPVALUE如果结果表和搜索表之间存在关系,在大多数情况下,使用 RELATED 函数而不是 LOOKUPVALUE 会更有效并提供更好的性能。 举个例子:基于当前表Sales的SalesOrderLineKey列,通过匹配Sales Order表中SalesOrderLineKey列,获取Sales Order表Channel字段的值。 CHANNEL = LOOKUPVALUE('Sales Order'[Channel],'Sales Order'[SalesOrderLineKey],'Sales'[SalesOrderLineKey]) 由于Sales和Sales Order之间存在关系多对一的关系,可以使用RELATED函数获得Sales Order表Channel字段的值。 CHANNEL = RELATED('Sales Order'[Channel]) 二,LOOKUPVALUE的替代写法举个例子,从table中获得result_column列的值: LOOKUPVALUE ( table[result_column], table[search_column_1], <expression_1>, table[search_column_2], <expression_2>, <alternate_result> ) 根据常规的替代方法,可以得到替代方案1: CALCULATE ( SELECTEDVALUE ( table[result_column] , <alternate_result> ) , FILTER ( ALLNOBLANKROW ( table[search_column_1] ) , table[search_column_1] = = <expression_1> ) , FILTER ( ALLNOBLANKROW ( table[search_column_2] ) , table[search_column_2] = = <expression_2> ) , REMOVEFILTERS ( ) ) 当 <expression_1> 和 <expression_2> 是常量值时,不会有任何问题。但是,通常情况下这些表达式是动态的,这可能会生成更昂贵的查询计划。为了减少这个工作,您可以将表达式移到 CALCULATE 中的过滤谓词之外,得到替代方案2: VAR filterValue1 = <expression_1> VAR filterValue2 = <expression_2> RETURN CALCULATE ( DISTINCT ( table[result_column] ), table[search_column_1] = filterValue1, table[search_column_2] = filterValue2, REMOVEFILTERS ( ) ) 使用TREATAS函数来实现搜索条件,得到解决方案3: CALCULATE ( DISTINCT ( table[result_column] ), TREATAS ( { <expression_1> }, table[search_column_1] ), TREATAS ( { <expression_2> }, table[search_column_2] ), REMOVEFILTERS ( ) ) 出于可读性原因,最好将 TREATAS 结果存储在变量中,但从查询计划的角度来看,以下代码也与前面的代码相同: VAR filter1 = TREATAS ( { <expression_1> }, table[search_column_1] ) VAR filter2 = TREATAS ( { <expression_2> }, table[search_column_2] ) RETURN CALCULATE ( DISTINCT ( table[result_column] ), filter1, filter2, REMOVEFILTERS ( ) ) 对于 LOOKUPVALUE 用例,可以创建单个多列过滤器而不是多个过滤器——可能会产生更好的查询计划,得到替代方案4: VAR filterLookup = TREATAS ( { ( <expression_1>, <expression_2> ) }, table[search_column_1], table[search_column_2] ) RETURN CALCULATE ( DISTINCT ( table[result_column] ), filterLookup, REMOVEFILTERS ( ) ) 在复杂场景中,LOOKUPVALUE 的替代方法可以优化迭代器中 LOOKUPVALUE 的存在导致性能不佳的情况。
参考文档: |
|