You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

DAX需求:计算表格中连续1值的分组(簇)数量

计算DAX中1值的连续分组(簇)数量的简洁实现

我有一个包含两列的表格,一列是日期(Date),一列是值(Val),取值为0或1,示例数据如下:

DateVal
1-Jan0
2-Jan0
3-Jan1
4-Jan1
5-Jan1
6-Jan0
7-Jan0
8-Jan1
9-Jan1
10-Jan1
11-Jan1
12-Jan1
13-Jan0
14-Jan0
15-Jan0
16-Jan1
17-Jan0
18-Jan1
19-Jan0
20-Jan0

需要创建一个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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 14:53:08