PowerBI DAX&x2013;对同一表的子查询

PowerBI DAX&x2013;对同一表的子查询,powerbi,dax,Powerbi,Dax,我有一个表,我们称之为Products,包含列: Id ProductId 版本 其他一些专栏 Id列是主键,ProductId对行进行分组。现在我想查看ProductId的不同值,其中Version最高 即从数据集: Id|ProductId|版本|…… 100|1|0|…… 101|2|0|…… 102|2|1|…… 103|2|2| 我需要得到: Id|ProductId|版本|…… 100|1|0|…… 103|2|2| 我会用SQL写: SELECT Id, ProductId,

我有一个表,我们称之为
Products
,包含列:

  • Id
  • ProductId
  • 版本
  • 其他一些专栏
Id
列是主键,
ProductId
对行进行分组。现在我想查看
ProductId
的不同值,其中
Version
最高

即从数据集:
Id
|
ProductId
|
版本
|……
100
|
1
|
0
|……
101
|
2
|
0
|……
102
|
2
|
1
|……
103
|
2
|
2
|

我需要得到:
Id
|
ProductId
|
版本
|……
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中不适用吗

您可以使用
summariecolumns
ProductId
MAX
版本进行分组

然后使用
ADDCOLUMNS
添加相应的
Id
编号,使用
Products
表中匹配的
ProductId
版本的过滤器。我在这里使用了
CONCATENATEX
,因此如果多个
Id
值具有相同的
产品
/
MAX
版本
组合,则所有
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],
            ","
        )
    )

您可以使用
summarycolumns
ProductId
MAX
版本进行分组

然后使用
ADDCOLUMNS
添加相应的
Id
编号,使用
Products
表中匹配的
ProductId
版本的过滤器。我在这里使用了
CONCATENATEX
,因此如果多个
Id
值具有相同的
产品
/
MAX
版本
组合,则所有
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],
            ","
        )
    )

另一种方法是首先构建产品标识及其最新版本的虚拟表,然后使用此表过滤原始表:

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]))
结果:


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

另一种方法是首先构建产品标识及其最新版本的虚拟表,然后使用此表过滤原始表:

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]))
结果:

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