【问题标题】:Power BI (dax) - Categorize records if search term existsPower BI (dax) - 如果存在搜索词,则对记录进行分类
【发布时间】:2021-09-09 03:05:23
【问题描述】:

我一直无法找到能够返回一致且正确选择的结果的答案。我希望有人可以提供帮助。

在 Power BI 中,我有两个表。 “事件”表中的“_Inc Look In Fields”列包含长文本字符串(大约 500K 记录)和该公式所在的“关键字”列。 “查找 - 会议”包含文本字符串列表,其中可能包含也可能不包含第二个搜索词,并且可能包含或不包含排除词和“返回”列中的关键字值。此表中有超过 120 种组合。

查找 - 会议表(120 多行)

事件表(500K+ 行)

这些表是不相关的,并且不包含两者共有的值。

我需要一个公式来搜索查找表中列出的第一个术语,排除排除列中的任何内容,以及它从查找表中找到的第一个匹配项,在关键字栏中输入“返回”值。然后它可以移动到事件中的下一行,等等。一旦找到第一个匹配的组合,它就不应继续搜索匹配的组合。

我现在有一个公式可以做到这一点(感谢 Alexis Olson),但有 2 个问题,我已经对 Alexis 进行了足够多的窃听。

我认为公式告诉它将查找表的 120 多行中的每一行与它正在查看的事件中的行进行比较(因此,通过在字段中查找 120 多次),然后选择 Maxx 或 Minx的结果列表(我已经尝试使用这两个选项,Minx 和 Maxx)。这不是很有效(导致它计算超过 60M 的连击),所以它很慢。但是,更重要的是,我无法弄清楚它认为 Minx 或 Maxx 是什么(它是返回值中的字符数,是搜索组合中的字符数,还是任意的等等?) .所以它并不总是返回第一个匹配的组合,因此会扭曲我的结果。

所以我要么需要对 Alexis 的公式进行调整,要么需要一个不同的调整。

谁能帮忙?

谢谢!

【问题讨论】:

    标签: search powerbi dax lookup contains


    【解决方案1】:

    您可以查看此解决方案:

    KEYWORD =  TOPN (
            1,
            SELECTCOLUMNS (
                FILTER (
                    ADDCOLUMNS (
                        GENERATE ( VALUES ( Incidents[_Inc Look In Fields] ), VALUES ( lookup_tab ) ),
                        "HitLookup",
                            (
                                CONTAINSSTRING ( Incidents[_Inc Look In Fields], lookup_tab[Search For Term 1] )
                                    && CONTAINSSTRING ( Incidents[_Inc Look In Fields], lookup_tab[Search For Term 2] )
                            )
                                && (
                                    NOT (
                                        CONTAINSSTRING ( Incidents[_Inc Look In Fields], lookup_tab[Exclude Term 1] )
                                    )
                                        || lookup_tab[Exclude Term 1] == ""
                                )
                    ),
                    [HitLookup]
                ),
                "Return", [Return]
            )
        )
    

    内部表产生这个:

    我们需要勾选“Show rows without data”(选择可视化 -> 右键单击​​数据字段并选择 show item with no data)

    【讨论】:

    • 我不懂公式。特别是:(1)我假设“lookup_tab”=包含搜索、排除和返回字段的表。那是对的吗? (2) 什么是“HitLookup”? (3)整个事情应该是一个列公式(所以我需要在开头添加“列名=”)? (4) “Exclude Term 1”后面应该有两个“=”吗? (5) 你能解释一下这个公式一般是做什么的吗?
    • 注意:当我在之前的评论中提到的与 #1 和 #3 相关的更改时,每一行都被分配了相同的返回值,它既不是列表中的第一个返回项,也不是第一个按字母顺序。另外,我应该在哪里“勾选“显示没有数据的行”?
    • 我的“lookup_tab”是您的示例“查找 - 会议”。 “HitLookup”是一个布尔值 True/False,用于过滤设置。是的,您需要在开头添加“column name =”。 (3) 应该是一种措施; (4) 如果你有 Nulls,这取决于你阅读这个:dax.guide/op/equal-todax.guide/op/strictly-equal-to (5) 我们为每个唯一事件生成一组来自 lookup_tab 的行,并检查是否满足条件。我也更新了我的答案。
    • 我还是不明白。 (A) 这是列公式还是度量?我需要它成为一个专栏。 (B) 原始公式导致每一行都返回相同的值。屏幕截图中的公式(与原始公式不同)会产生此错误:“表达式引用多列。多列不能转换为标量值。” (C) 我也关心效率,因为您的屏幕截图表明它为每一行生成内部表。我希望它在结果为“True”并给我“Return”后立即停止检查该行,然后执行下一行,等等。
    • 这是一个衡量标准,我在您的问题中没有看到您需要计算列;为什么选择计算列??我向您展示了一个内部表格,以更好地了解正在发生的事情。在集合上工作比逐个循环遍历所有行要快(DAX 没有循环/中断条件)。您应该使用原始代码,其他任何内容仅用于解释目的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-17
    • 2022-09-27
    • 1970-01-01
    • 2023-02-15
    • 2017-06-21
    • 2021-12-18
    相关资源
    最近更新 更多