Power BI中基于多列值创建计数器列的问题
Power BI计算列
total_count修正方案 我在Power BI中有一个名为Query 2的表格,数据如下:
| record_id | site | start_date | activity | end_date | duration | total_count(预期) |
|---|---|---|---|---|---|---|
| 10 | 1 | 9/24/2022 | baseball | 10/1/2022 | 1 | 1 |
| 10 | 1 | 10/11/2022 | baseball | 11/1/2022 | 1 | 2 |
| 10 | 1 | 9/24/2022 | basketball | 11/1/2022 | 3 | 3 |
| 10 | 1 | 10/1/2022 | basketball | 11/1/2022 | 3 | |
| 10 | 1 | 10/11/2022 | basketball | 11/1/2022 | 3 | |
| 10 | 1 | 10/11/2022 | football | 12/12/2022 | 2 | 4 |
| 10 | 1 | 11/1/2022 | football | 12/12/2022 | 2 | |
| 10 | 1 | 11/1/2022 | soccer | 12/12/2022 | 1 | 5 |
需求说明
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() )
错误原因分析
- 错误地将
duration加入分组判断逻辑,而需求仅要求按record_id、activity、end_date分组 - 通过拼接字符串的大小比较筛选
PreviousRows,易因字符串排序规则导致分组计数错误 - 计数逻辑未准确统计唯一分组数量,而是统计了所有符合字符串小于条件的行
修正后的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
相关产品推荐
相关产品推荐

