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]))
结果:
这种方法的好处是优化查询执行计划