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

Power BI中基于多列值创建计数器列的问题

Power BI计算列total_count修正方案

我在Power BI中有一个名为Query 2的表格,数据如下:

record_idsitestart_dateactivityend_datedurationtotal_count(预期)
1019/24/2022baseball10/1/202211
10110/11/2022baseball11/1/202212
1019/24/2022basketball11/1/202233
10110/1/2022basketball11/1/20223
10110/11/2022basketball11/1/20223
10110/11/2022football12/12/202224
10111/1/2022football12/12/20222
10111/1/2022soccer12/12/202215

需求说明

total_count是目标计算列,规则为:

  • 基于record_id、activity和end_date的组合值生成计数
  • 当这三列中任意一列值变化时,计数加1
  • 后续行若与当前组的这三列值完全一致,则该行保持为空,不增加计数

问题描述

我尝试了以下DAX代码,但计算结果有误——预期total_count为4的位置,实际得到了6:

Total_Count =
VAR CurrentRow =
'Query2'[record_id] & "-" & 'Query2'[Activity] & "-" & 'Query2'[end_date] & "-" &   'Query2'[duration]
VAR PreviousRows =
FILTER(
    'Query2',
    'Query2'[record_id] & "-" & 'Query2'[Activity] & "-" & 'Query2'[end_date] & "-" & 'Query2'[duration] < CurrentRow
)
   RETURN
IF(
    RANKX(
        FILTER(
            'Query2',
            'Query2'[record_id] = EARLIER('Query2'[record_id]) &&
            'Query2'[Activity] = EARLIER('Query2'[Activity]) &&
            'Query2'[end_date] = EARLIER('Query2'[end_date]) &&
            'Query2'[duration] = EARLIER('Query2'[duration])
        ),
        'Query2'[start_date],
        ,
        ASC,
        DENSE
    ) = 1,
    COUNTROWS(PreviousRows) + 1,
    BLANK()
)

错误原因分析

  1. 错误地将duration加入分组判断逻辑,而需求仅要求按record_id、activity、end_date分组
  2. 通过拼接字符串的大小比较筛选PreviousRows,易因字符串排序规则导致分组计数错误
  3. 计数逻辑未准确统计唯一分组数量,而是统计了所有符合字符串小于条件的行

修正后的DAX代码

方案一:基于分组键的计数逻辑

Total_Count = 
VAR CurrentGroup = 
    'Query 2'[record_id] & "-" & 'Query 2'[activity] & "-" & 'Query 2'[end_date]
-- 判断当前行是否为该分组下最早的start_date行
VAR IsFirstInGroup = 
    RANKX(
        FILTER(
            'Query 2',
            'Query 2'[record_id] = EARLIER('Query 2'[record_id]) &&
            'Query 2'[activity] = EARLIER('Query 2'[activity]) &&
            'Query 2'[end_date] = EARLIER('Query 2'[end_date])
        ),
        'Query 2'[start_date],
        ,
        ASC,
        DENSE
    ) = 1
-- 统计当前分组之前的所有唯一分组数量
VAR PreviousUniqueGroups = 
    COUNTROWS(
        DISTINCT(
            SELECTCOLUMNS(
                FILTER(
                    'Query 2',
                    'Query 2'[record_id] & "-" & 'Query 2'[activity] & "-" & 'Query 2'[end_date] < CurrentGroup
                ),
                "GroupKey", 'Query 2'[record_id] & "-" & 'Query 2'[activity] & "-" & 'Query 2'[end_date]
            )
        )
    )
RETURN
    IF(IsFirstInGroup, PreviousUniqueGroups + 1, BLANK())

方案二:基于分组排名的简洁写法

Total_Count = 
VAR AllGroups = 
    SUMMARIZE(
        'Query 2',
        'Query 2'[record_id],
        'Query 2'[activity],
        'Query 2'[end_date],
        "MinStartDate", MIN('Query 2'[start_date])
    )
VAR CurrentGroupKey = ('Query 2'[record_id], 'Query 2'[activity], 'Query 2'[end_date])
-- 按分组的最早start_date生成排名
VAR GroupRank = 
    RANKX(
        AllGroups,
        [MinStartDate],
        ,
        ASC,
        DENSE
    )
-- 判断当前行是否为分组内最早的start_date行
VAR IsFirstRow = 
    'Query 2'[start_date] = MAXX(
        FILTER(AllGroups, [record_id] = 'Query 2'[record_id] && [activity] = 'Query 2'[activity] && [end_date] = 'Query 2'[end_date]),
        [MinStartDate]
    )
RETURN
    IF(IsFirstRow, GroupRank, BLANK())

代码说明

  • 两个方案均严格遵循需求,仅按record_id、activity、end_date进行分组
  • 仅在分组内最早的start_date行显示计数,其余行返回空值
  • 计数按分组出现的先后顺序(以最早的start_date为准)递增

内容的提问来源于stack exchange,提问作者mcadamsjustin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 13:40:58