如何在SSAS查询中基于分组数据另一列的最大值筛选列?
如何在SSAS查询中基于分组数据另一列的最大值筛选列?
嗨,我懂你现在的困扰——想给每个SKU(产品)筛选出从它最早出现最大销量的那周开始到最后的所有数据,之前的DAX写法因为上下文引用的问题报错了对吧?我来帮你搞定这个需求!
先理清楚核心需求
你要的是:
- 对每个产品,找到它销量最高的所有周里最早的那个周(比如SKU333有两周销量都是120,就取更早的周4)
- 然后只保留该产品中周数大于等于这个基准周的所有记录
解决方案一:用预计算基准周的方式(性能更优)
这种方法先给每个产品计算好对应的基准周,再用这个基准周去筛选数据,适合数据量较大的场景:
EVALUATE VAR ProductMaxSalesWeeks = ADDCOLUMNS ( VALUES ( 'Product'[Product] ), "@FirstMaxSalesWeek", CALCULATE ( MIN ( 'Week'[WEEK] ), -- 取最大销量周里最早的那个 FILTER ( ALL ( 'Week'[WEEK] ), [Sales Qty] = CALCULATE ( MAX ( [Sales Qty] ), ALL ( 'Week'[WEEK] ) ) ) ) ) VAR FilteredSalesData = FILTER ( SUMMARIZECOLUMNS ( 'Product'[Product], 'Week'[WEEK], "Sales", [Sales Qty] ), 'Week'[WEEK] >= LOOKUPVALUE ( ProductMaxSalesWeeks[@FirstMaxSalesWeek], ProductMaxSalesWeeks[Product], 'Product'[Product] ) ) RETURN FilteredSalesData
代码解释:
ProductMaxSalesWeeks:给每个产品单独计算出最早的最大销量周——先忽略当前周上下文,算出该产品所有周的最大销量,再筛选出所有达到这个销量的周,取其中最小的周数。FilteredSalesData:先获取你原来的汇总数据,再通过LOOKUPVALUE匹配当前产品的基准周,只保留周数≥基准周的记录。
解决方案二:紧凑的 inline 写法
如果你喜欢更简洁的代码,也可以直接在FILTER里完成分组计算:
EVALUATE FILTER ( SUMMARIZECOLUMNS ( 'Product'[Product], 'Week'[WEEK], "Sales", [Sales Qty] ), 'Week'[WEEK] >= CALCULATE ( MIN ( 'Week'[WEEK] ), ALLEXCEPT ( 'Product', 'Product'[Product] ), -- 只保留当前产品的上下文,清除其他筛选 [Sales Qty] = CALCULATE ( MAX ( [Sales Qty] ), ALLEXCEPT ( 'Product', 'Product'[Product] ) ) ) )
代码解释:
在筛选每一行的时候,用ALLEXCEPT锁定当前产品的上下文,先算出该产品的最大销量,再找到所有等于这个销量的周里最早的那个,最后判断当前周是否符合≥基准周的条件。
为什么你原来的写法会报错?
你之前的代码里,[Sales]是SUMMARIZECOLUMNS生成的临时计算列,但在CALCULATE的上下文里无法直接引用这个临时列;而且你没有按产品分组去计算最大销量对应的周,导致DAX找不到正确的上下文关联,所以才会出现“无法识别包含[Sales]列的表”的错误。
备注:内容来源于stack exchange,提问作者Jakub Szczupakowski
相关产品推荐
相关产品推荐

