【问题标题】:PowerBI DAX – subquery to the same tablePowerBI DAX – 同一张表的子查询
【发布时间】:2020-01-15 09:23:29
【问题描述】:

我有一张桌子,我们称它为 Products 并带有列:

  • Id
  • ProductId
  • Version
  • 其他一些专栏

Id 列是主键,ProductId 对行进行分组。现在我想查看ProductId 的不同值,其中Version 最高。

即来自数据集:
Id | ProductId | Version | ...
100 | 1 | 0 | ...
101 | 2 | 0 | ...
102 | 2 | 1 | ...
103 | 2 | 2 | ...

我需要得到:
Id | ProductId | Version | ...
100 | 1 | 0 | ...
103 | 2 | 2 | ...

在 SQL 中我会写:

SELECT Id, ProductId, Version, OtherColumns
FROM Products p1 
WHERE NOT EXISTS 
(SELECT 1 
 FROM Products p2
 WHERE p2.ProductId = p1.ProductId
 AND p2.Version > p1.Version)

但我不知道如何在 DAX 中表达这一点。这种带有子查询的方法在 PowerBI 中是否不适用?

【问题讨论】:

    标签: powerbi dax


    【解决方案1】:

    另一种做法是先构造一张product_ids及其最新版本的虚拟表,然后用这张表对原表进行过滤:

    EVALUATE 
    VAR Latest_Product_Versions = 
          ADDCOLUMNS(
             VALUES('Product'[Product_Id]),
             "Latest Version", CALCULATE(MAX('Product'[Version])))
    
    RETURN 
    CALCULATETABLE(
        'Product', 
        TREATAS(Latest_Product_Versions, 'Product'[Product_Id], 'Product'[Version]))
    

    结果:

    这种方法的好处是优化查询执行计划。

    【讨论】:

      【解决方案2】:

      您可以使用SUMMARIZECOLUMNSProductIdMAX Version 进行分组。

      然后使用ADDCOLUMNS 添加相应的Id 数字,使用Products 表上的过滤器匹配ProductIdVersion。我在这里使用了CONCATENATEX,因此如果多个Id 值具有相同的Product / MAX Version 组合,则所有Id 值都将作为列表返回。

      EVALUATE 
          ADDCOLUMNS (
              SUMMARIZECOLUMNS ( 
                  Products[ProductId],
                  "@Max Version",
                  MAX ( Products[Version] )
              ),
              "@Max Version Id",
              CONCATENATEX ( 
                  FILTER ( 
                      Products,
                      Products[Version] = [@Max Version] && Products[ProductId] = EARLIER ( Products[ProductId] )
                  ),
                  Products[Id],
                  ","
              )
          )
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-06-11
        • 1970-01-01
        • 2022-12-07
        • 1970-01-01
        • 1970-01-01
        • 2013-07-19
        • 1970-01-01
        相关资源
        最近更新 更多