【问题标题】:DAX Average of Distinct Count Over two tables两个表的不同计数的 DAX 平均值
【发布时间】:2020-12-18 07:54:55
【问题描述】:

我有两个表(Sales、Stock)都有一个 DateKey 和 ProductCode。要求是按自定义日期维度驱动的财务周计算两个表中的不同产品代码。如果选择了多个周而不是所有周的不同计数,则还需要获取每周不同计数的平均值。

下面的 DAX 在我的单元测试中工作,但是在实际数据量(导入 300+ 百万行)上它完全停止。如果我选择一周大约需要 5 秒,12 个月需要 60 秒。他们需要进行 YoY 和 WoW 计算,因此这种性能还不够好。不知道还有什么方法可以做到这一点。

这是我编写的 DAX:

Option Count = 
    // Get options at a week level for Sales
    VAR SalesOptions =
        SELECTCOLUMNS (
            Sales,
            "Week",
                CALCULATE (
                    MAX ( Dates[Financial Year Week Number] ),
                    FILTER ( ALL ( Dates ), Sales[DimBilledDateSKey] = Dates[DimDateSKey] )
                ),
            "ProductOptionCode", 'Sales'[ProductOptionCode]
        )
    // Get options at a week level for Stock
    VAR StockOptions =
        SELECTCOLUMNS (
            Stock,
            "Week",
                CALCULATE (
                    MAX ( Dates[Financial Year Week Number] ),
                    FILTER ( ALL ( Dates ), Stock[DimDateSKey] = Dates[DimDateSKey] )
                ),
            "ProductOptionCode", 'Stock'[ProductOptionCode]
        )
    // Union the options from both and then apply a distinct so that a count of the product code would be the same result as a distinct count
    VAR CombinedOptions = DISTINCT ( UNION ( SalesOptions, StockOptions ) )
            
    RETURN
        // Average the weekly disitnct option count
        AVERAGEX( 
            // Group the above union by week and do a count of the options for the week. They should now be distinct due to the distinct applied to the union
            GROUPBY(CombinedOptions, [Week], "Week Option Count", COUNTX(CURRENTGROUP(),  [ProductOptionCode] )),
            [Week Option Count]
        )

【问题讨论】:

    标签: powerbi dax


    【解决方案1】:

    我构建了一个带有假 Dates 维度和 Stock 和 Sales 假表的小模型

    Dates = 
    SELECTCOLUMNS(
        CALENDAR(
            "2020-01-05",
            "2020-12-26"
        ),
        "DimDateSKey", [Date],
        "Financial Year", YEAR( [Date] ),
        "Financial Year Week Number",
            INT( ( [Date] - "2020-01-05" ) / 7 ) + 2
    )
    
    Sales = DATATABLE(
        "DimBilledDateSKey", DATETIME,
        "ProductOptionCode", INTEGER,
        {
            {"2020-01-05", 1},
            {"2020-01-06", 1},
            {"2020-01-06", 2},
            {"2020-01-12", 1}
        }    
      )
    
    Stock = DATATABLE(
        "DimDateSKey", DATETIME,
        "ProductOptionCode", INTEGER,
        {
            {"2020-01-09", 1},
            {"2020-01-06", 3},
            {"2020-01-08", 3},
            {"2020-01-13", 2}
        }    
      )
    

    通过日期上的两个关系,很容易过滤财政周,这避免了遍历整个日期表的需要。

    要计算不同产品代码的平均数量,只需遍历选定的财政年度周数,然后计算当前销售[ProductOptionCode] 的 UNION 的 DISTINCT 和 Stock[ProductOptionCode] 的 COUNTROWS迭代周

    Option Count = 
    AVERAGEX (
        VALUES( Dates[Financial Year Week Number] ),
        CALCULATE (
            COUNTROWS (
                DISTINCT(
                    UNION (
                        VALUES( Sales[ProductOptionCode] ),
                        VALUES( Stock[ProductOptionCode] )
                    )
                )
            )
        )
    )
    

    如果真实模型不包含与 DimBilledDateSKey 的关系,可能是因为在 Sales 表中已经存在与另一个 dateKey 的另一个关系,则始终可以在 CALCULATE 中添加一个非活动关系以使用 USERLATIONSHIP 激活。

    它应该更快,因为它使用关系,从性能的角度来看,这通常是最好的选择,并且最大限度地减少了 Set 函数的使用,因为它们会在内存中实现表。

    【讨论】:

      猜你喜欢
      • 2019-03-16
      • 1970-01-01
      • 2012-02-11
      • 2022-07-08
      • 1970-01-01
      • 2021-08-09
      • 2020-09-14
      • 2019-03-16
      • 2017-03-03
      相关资源
      最近更新 更多