DAX需求:计算表格中连续1值的分组(簇)数量
计算DAX中1值的连续分组(簇)数量的简洁实现
我有一个包含两列的表格,一列是日期(Date),一列是值(Val),取值为0或1,示例数据如下:
| Date | Val |
|---|---|
| 1-Jan | 0 |
| 2-Jan | 0 |
| 3-Jan | 1 |
| 4-Jan | 1 |
| 5-Jan | 1 |
| 6-Jan | 0 |
| 7-Jan | 0 |
| 8-Jan | 1 |
| 9-Jan | 1 |
| 10-Jan | 1 |
| 11-Jan | 1 |
| 12-Jan | 1 |
| 13-Jan | 0 |
| 14-Jan | 0 |
| 15-Jan | 0 |
| 16-Jan | 1 |
| 17-Jan | 0 |
| 18-Jan | 1 |
| 19-Jan | 0 |
| 20-Jan | 0 |
需要创建一个DAX度量值,计算数据集中1值的分组(簇)数量,此示例的正确结果应为4。
我已写出一个可用但不够简洁的DAX度量值:
var ClusterStart = ADDCOLUMNS( 'Table', "Cluster Start", var PreviousNumber = CALCULATE ( MAX ( 'Table'[Val] ), FILTER ( ALL ( 'Table'), 'Table'[Date] = EARLIER ( 'Table'[Date])-1 )) return if(AND('Table'[Val]=1,PreviousNumber<>1),1,0)) return SUMX(ClusterStart,[Cluster Start])
希望得到更简洁优雅的实现方案。
简洁实现方案
方案1:基于PREVIOUSDAY(适用于连续日期场景)
1值簇数量 = COUNTX( FILTER( 'Table', 'Table'[Val] = 1 && COALESCE(CALCULATE(MAX('Table'[Val]), PREVIOUSDAY('Table'[Date])), 0) = 0 ), 'Table'[Date] )
方案2:基于OFFSET函数(DAX 2023+版本适用)
如果你的Power BI/SSAS环境支持DAX 2023及以上版本,OFFSET可以摆脱日期连续性的限制,仅依赖日期列的排序:
1值簇数量 = COUNTX( FILTER( 'Table', 'Table'[Val] = 1 && COALESCE(OFFSET(-1, 'Table', ORDERBY('Table'[Date]))[Val], 0) = 0 ), 'Table'[Date] )
方案3:紧凑的SUMX写法
保留原逻辑的核心,但去掉中间表,直接在迭代中完成计算:
1值簇数量 = SUMX( 'Table', IF( 'Table'[Val] = 1 && COALESCE(CALCULATE(MAX('Table'[Val]), 'Table'[Date] = EARLIER('Table'[Date]) - 1), 0) = 0, 1, 0 ) )
方案优势
- 移除了冗余的
ADDCOLUMNS中间表,逻辑更直接紧凑 - 使用
COALESCE处理边界情况(首个日期无前驱数据时默认视为0) OFFSET版本适配非连续日期的场景,适用性更广
内容的提问来源于stack exchange,提问作者Michal
相关产品推荐
相关产品推荐

