不相关表中的DAX查找第一个非空白值

时间:2019-12-12 17:40:22

标签: powerbi dax

如何在不相关表中查找第一个非空白值。它等效于SQL:outer apply (select top 1或等效于Excel VLOOKUP

DAX函数LOOKUPVALUE似乎正在完成工作,但是如果在搜索表中找到多个值,它将返回错误。

LOOKUPVALUE(
      SearchTable[name]
    , SearchTable[id] -- how to get the fist value, if here are multiple id?
    , ThisTable[id]
    )

样本数据文件:

DAX lookup top 1 value.pbix

我将样本数据Karl Anka's solution中的内容作为预期结果。对于任何其他解决此问题的方法,我将不胜感激。我欢迎对它们的性能发表评论。

更新。评论亚历克西斯·奥尔森的答案。

如果仅返回一个唯一值,则

LOOKUPVALUE函数可以正常工作。如果查找在搜索表中找到不同的值,则函数返回错误。例如,如果MyTable中“产品”苹果的“类别”列中有两个不同的值,说一个值是Fruits,另一个值是Delicious Fruits,那么我们将收到以下错误消息:

  

提供了多个值的表,其中单个值是   预期的。

error message 当然,我们不希望出现错误消息,我们对前1个结果感到满意。我更新了示例数据,以便可以重现此错误。

评论已接受的答案。

示例数据现在包含4个工作解决方案。我已根据自己的喜好为它们编号。前两个是亚历克西斯·奥尔森(Alexis Olson)创作的。据我从DAX Studio可以了解到的那样,这两种解决方案都同样快,并且具有简单的执行计划。第二种解决方案是唯一仅执行两次表扫描的解决方案(所有其他方法均进行3次扫描)。第三种解决方案具有复杂的执行计划,并且在第三次扫描期间,它将遍历整个搜索表,而不管它是否是一百万行。

如果您能分享这些方法的效果,我将不胜感激。

尽管我更喜欢VAR而不是EARLIER变体,但我最喜欢Alexis Olson的第二种方法:

CaclculateMaxVar = 
var LookupKey = ThisTable[Product]
return
CALCULATE (
    MAX ( SearchTable[Category] ),
    SearchTable[Product] = LookupKey
)

4 个答案:

答案 0 :(得分:1)

尝试一下:

Column =
VAR row_id = ThisTable[id] 
VAR ret_val =
    SELECTCOLUMNS (
        TOPN (
            1;
            CALCULATETABLE (
                SearchTable;
                SearchTable[id] = row_id;
                SearchTable[name] <> BLANK ()
            )
        );
        "name"; SearchTable[name]
    )
RETURN
    ret_val

答案 1 :(得分:1)

有很多方法可以做到这一点。这是我想到的前三名:

最简单的方法是查找功能,但仅在SearchTable中与每个产品相关联的类别都有效。

LookupFunction =
LOOKUPVALUE ( SearchTable[Category], SearchTable[Product], ThisTable[Product] )

以下内容仍应适用于多种分类的产品:

MaxxLookup =
MAXX (
    FILTER ( SearchTable, SearchTable[Product] = ThisTable[Product] ),
    SearchTable[Category]
)
CaclculateMaxLookup =
CALCULATE (
    MAX ( SearchTable[Category] ),
    SearchTable[Product] = EARLIER ( ThisTable[Product] )
)

如果您希望将第二或第三作为度量而不是计算列,则需要对其进行调整。


注意:上面的方法可以很好地用作计算列。如果希望它们既用作计算列又用作度量,则按以下步骤进行调整:

LookupMeasure =
LOOKUPVALUE (
    SearchTable[Category],
    SearchTable[Product], CALCULATE ( SELECTEDVALUE ( ThisTable[Product] ) )
)
MaxxMeasure=
VAR CurrProduct = CALCULATE ( SELECTEDVALUE ( ThisTable[Product] ) )
RETURN
    MAXX (
        FILTER ( SearchTable, SearchTable[Product] = CurrProduct ),
        SearchTable[Category]
    )
CaclculateMaxMeasure =
VAR CurrProduct = CALCULATE ( SELECTEDVALUE ( ThisTable[Product] ) )
RETURN
    CALCULATE ( MAX ( SearchTable[Category] ), SearchTable[Product] = CurrProduct )

区别在于,当您编写计算列时,会有行上下文告诉您要使用哪种产品。编写度量时,需要从ThisTable[Product]列中指定要使用的值。

注意:如果您的过滤器上下文中有多个产品,并且您希望度量标准查找最大产品的类别,则使用MAX而不是SELECTEDVALUE。如果有多个值,则后者将返回空白。


编辑:

以上公式适用于提供的原始数据集。但是,如果SearchTable中的一个产品与多个类别相关联,则LOOKUPVALUE函数将中断(因为它只期望一个值),因此您需要使用{{1 }}或MAX版本。

答案 2 :(得分:1)

我想我解决了这个问题: Measure0是小节 Measure1是“计算列”度量 苹果之所以没有类别,是因为它有3个类别并且不能选择一个类别,因此它返回空白

Measure0 =
FIRSTNONBLANK (
    SearchTable[Category],
    CALCULATE (
        MAX ( SearchTable[Product] ),
        TREATAS ( VALUES ( ThisTable[product] ), SearchTable[Product] )
    )
)
Measure1 =
CALCULATE (
    FIRSTNONBLANK (
        SearchTable[Category],
        CALCULATE (
            MAX ( SearchTable[Product] ),
            TREATAS ( VALUES ( ThisTable[product] ), SearchTable[Product] )
        )
    )
)

答案 3 :(得分:0)

有一个FIRSTNONBLANK(列,表达式)函数。有用吗?