DAX技术问题:基于Index获取每个ID的最后一行数据
按ID获取对应最大Index行的DAX解决方案
需求:基于Index列,获取每个ID对应的最后一行数据(即每个ID取其最大Index值所在的行)。原DAX度量值未得到正确结果,预期输出为127,实际返回5。
原错误DAX代码
Last row of ID's = CALCULATE(COUNT('Table'[ID]), GROUPBY('Table', 'Table'[ID]), FILTER(Table, Table[Index] = MAX('Table'[Index])))
示例数据
| ID | Date | Index |
|---|---|---|
| 10151 | 2021-10-04 | 1 |
| 10151 | 2021-10-05 | 2 |
| 10151 | 2021-10-06 | 3 |
| 10151 | 2021-10-07 | 4 |
| 10151 | 2021-10-08 | 5 |
| 10152 | 2021-10-04 | 6 |
| 10152 | 2021-10-05 | 7 |
| 10152 | 2021-10-06 | 8 |
| 10153 | 2021-10-04 | 9 |
| 10153 | 2021-10-05 | 10 |
问题分析
原代码逻辑存在两处关键问题:
MAX('Table'[Index])是在整个表的上下文计算最大值,而非每个ID分组后的最大值,导致仅筛选出全局最大Index的行;- CALCULATE中GROUPBY与FILTER的组合逻辑混乱,未正确实现"按ID分组取最大Index"的需求。
正确解决方案
方案1:创建计算表,直接获取所有ID的最后一行数据
此方法会生成一张新表,包含每个ID对应最大Index的完整行数据:
Last Rows per ID = VAR MaxIndexPerID = SUMMARIZE( 'Table', 'Table'[ID], "@MaxIndex", MAX('Table'[Index]) ) RETURN NATURALINNERJOIN('Table', MaxIndexPerID)
方案2:度量值计算符合条件的行数(对应预期输出127的场景)
如果需要统计每个ID最后一行的总数量,可使用此度量值:
Count of Last Rows = COUNTROWS( SUMMARIZE( 'Table', 'Table'[ID], "@MaxIndex", MAX('Table'[Index]) ) )
方案3:度量值返回当前ID的最大Index值
在矩阵/表格中每行显示对应ID的最大Index值,可使用:
Max Index per ID = CALCULATE( MAX('Table'[Index]), ALLEXCEPT('Table', 'Table'[ID]) )
内容的提问来源于stack exchange,提问作者BI_Loek
相关产品推荐
相关产品推荐

