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

如何修改Power BI中的DAX度量值,按最高Period统计活跃客户

问题

在Power BI中,我有一张名为EpiDates的表(包含数千条记录),数据示例如下:

Period   ClientID   AdmDate      DischDate       LOS
1        222        5/23/2022    12/31/2050      396
2        222        5/23/2022    12/31/2050      396
3        222        5/23/2022    12/31/2050      396
2        333        3/01/2022    12/31/2050      479
3        333        3/01/2022    12/31/2050      479
0        444        1/23/2023    12/31/2050      151
1        444        1/23/2023    12/31/2050      151
2        555        1/23/2023     2/23/2023       30

我需要创建名为Active Clients的DAX度量值,统计DischDate等于12/31/2050的唯一ClientID数量。

现有DAX代码:

CALCULATE (DISTINCTCOUNT (EpiDates'[ClientID] ), 
            EpiDates'[DischDate]= DATE(2050, 12, 31))

但创建矩阵可视化后得到以下结果:

Period   # Active Clients
0        1
1        2
2        2
3        2

当前度量值会按分组的Period分别统计ClientID数量。我的目标是生成如下矩阵:仅统计每个ClientID对应的最高Period值中,DischDate为12/31/2050的唯一客户数:

Period    # Active Clients
1         1
3         2

说明:

  • Period 1是ClientID=444的最高周期,统计1个活跃客户
  • Period 3是ClientID=333、222的最高周期,统计2个活跃客户
  • Period 2是ClientID=555的最高周期,但DischDate不等于12/31/2050,故不统计
  • Period 0没有客户将其作为最高周期,故不统计

请求修改现有DAX度量值以实现需求。

解决方案

可以使用以下DAX度量值实现需求:

Active Clients = 
CALCULATE (
    DISTINCTCOUNT ( EpiDates[ClientID] ),
    // 筛选出当前客户的最高周期记录
    FILTER (
        ALLEXCEPT ( EpiDates, EpiDates[ClientID] ),
        EpiDates[Period] = CALCULATE ( MAX ( EpiDates[Period] ), ALLEXCEPT ( EpiDates, EpiDates[ClientID] ) )
    ),
    // 筛选出院日期符合条件的记录
    EpiDates[DischDate] = DATE ( 2050, 12, 31 )
)

逻辑说明

  1. ALLEXCEPT ( EpiDates, EpiDates[ClientID] ):保留当前客户的上下文,移除其他列的筛选影响,确保只针对单个客户计算最高周期。
  2. CALCULATE ( MAX ( EpiDates[Period] ), ... ):计算当前客户的最高周期值。
  3. 外层筛选:只保留客户最高周期的记录,同时满足出院日期为2050-12-31的条件,最后统计该条件下的唯一客户数。

如果需要更直观的分步逻辑,也可以使用变量拆分的版本:

Active Clients = 
// 第一步:为每个客户计算最高周期和是否活跃
VAR ClientInfo = 
    ADDCOLUMNS (
        VALUES ( EpiDates[ClientID] ),
        "@MaxPeriod", CALCULATE ( MAX ( EpiDates[Period] ) ),
        "@IsActive", CALCULATE ( MAX ( EpiDates[DischDate] ) = DATE ( 2050, 12, 31 ) )
    )
// 第二步:筛选出活跃客户,并按最高周期分组计数
VAR PeriodCount = 
    GROUPBY (
        FILTER ( ClientInfo, [@IsActive] = TRUE() ),
        [@MaxPeriod],
        "@ClientCount", COUNTX ( CURRENTGROUP(), [ClientID] )
    )
// 返回当前周期对应的客户数
RETURN
    SUMX ( FILTER ( PeriodCount, [@MaxPeriod] = SELECTEDVALUE ( EpiDates[Period] ) ), [@ClientCount] )

内容的提问来源于stack exchange,提问作者Hell-1931

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 17:43:15