4

如何在不相关的表中查找第一个非空白值。我想要相当于:

  • SQLouter apply (select top 1 ...)
  • 电子表格VLOOKUP

该代码中使用的 DAXLOOKUPVALUE函数不起作用。

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

LOOKUPVALUE如果结果只返回一个唯一值,DAX函数可以正常工作。LOOKUPVALUE如果在搜索表中找到一个键的多个值,则该函数返回错误消息:

在需要单个值的地方提供了一个包含多个值的表。

错误信息 我不想要错误消息,我对前 1 个结果感到满意。

样本数据文件:

DAX 查找前 1 个值.pbix

评论接受的答案

我最喜欢 Alexis Olson 的第二种方法,尽管我更喜欢VAR变化EARLIER

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

我接受了它,尽管我有一种强烈的感觉,这不是可能存在的最佳答案。函数返回MAX而不是返回TOP 1显然是额外的努力。

样本数据现在包含 4 个工作解决方案。我根据自己的喜好给它们编号了。前两个是亚历克西斯奥尔森。据我从 DAX Studio 中了解到的,这两种解决方案都同样快速并且具有简单的执行计划。第二种解决方案是唯一只执行两次表扫描的解决方案(所有其他方法都有 3 次扫描)。第三种解决方案的执行计划很复杂,在第三次扫描时,它会遍历整个搜索表,无论是否是一百万行。

这个问题有一个后续问题,我尝试比较 Dax Studio 中的查询:

如何在 Daxstudio 中检查哪个 DAX 查询具有更好的性能?

更新寻求进一步改进

我想知道是否有可能实现比当前获胜答案更短的查询计划。获胜代码将在DaxStudio中进行评估,并且查询计划应该更短,然后总共 20 行查询计划的物理行和逻辑行。

-- Bounty code
EVALUATE
ADDCOLUMNS (
    VALUES ( ThisTable[Product] ),
    "FilterLookup",
    VAR LookupKey = ThisTable[Product]
    RETURN
        CALCULATE ( MAX ( SearchTable[Category] ), SearchTable[Product] = LookupKey )
)
4

4 回答 4

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
于 2019-12-13T07:50:45.440 回答
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] )
)

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


注意:以上作为计算列工作正常。如果您希望它们同时用作计算列和度量,请按如下方式调整它们:

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函数将中断(因为它只需要一个值),您将需要使用其中一个MAXMAXX版本。

于 2019-12-13T15:30:48.873 回答
1

我想我解决了这个问题: Measure0 is measure Measure1 is Calculated Column measure Apple has no Category 因为它有 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] )
        )
    )
)
于 2020-08-21T02:43:24.810 回答
0

有一个 FIRSTNONBLANK(column, expression) 函数。它没有帮助吗?

于 2019-12-12T17:55:39.113 回答