【自记】Power BI 中 DISTINCT 和 ALLNOBLANKROW 的区别说明
在 DAX 中,DISTINCT
和 ALLNOBLANKROW
都是用于处理表或列中数据的函数,主要用于返回去重结果或清除筛选,但二者的功能、适用场景和行为有显著差异。以下从功能定义、语法、使用场景和核心区别四个方面详细说明:
一、DISTINCT
函数:返回去重后的列或表
1. 功能定义
DISTINCT
用于返回一列或一个表中不重复的值(去重),会保留原始数据中的空白值(Blank),但去除完全重复的行或值。
2. 语法
- 针对单列:
DISTINCT(<列>)
返回该列中所有不重复的值(包含空白值),结果是一个单列表。 - 针对表:
DISTINCT(<表>)
返回该表中所有不重复的行(即去除完全相同的行),结果保留原表结构。
3. 示例
假设有 '销售表'
包含 [商品ID]
列,值为 {1, 2, 2, 3, BLANK, 3, BLANK}
:
DISTINCT('销售表'[商品ID])
返回{1, 2, 3, BLANK}
(去重后保留空白值)。
若 '销售表'
有两行完全相同的记录(如两行的 [商品ID]
和 [销售日期]
均相同):
DISTINCT('销售表')
会去除其中一行,只保留唯一的行。
4. 适用场景
- 统计某列的不重复值数量(配合
COUNTROWS
):商品种类数 = COUNTROWS(DISTINCT('销售表'[商品ID]))
- 生成去重后的子表,用于筛选或关联分析。
二、ALLNOBLANKROW
函数:清除筛选并去除空白行
1. 功能定义
ALLNOBLANKROW
是 ALL
函数的变体,用于清除指定表或列上的所有筛选上下文,同时自动去除结果中的空白行(Blank Row)。
它的核心作用是返回 “基础数据集中所有非空白的完整值集”,不受当前筛选器影响。
2. 语法
- 针对整个表:
ALLNOBLANKROW(<表>)
返回该表中所有非空白的行(去除空白行),且忽略所有对该表的筛选。 - 针对表中的列:
ALLNOBLANKROW(<表>[列])
返回该列中所有非空白的不重复值,且忽略所有对该列的筛选。
3. 示例
假设有 '商品表'
包含 [商品ID]
列,值为 {1, 2, 3, BLANK}
,且当前筛选器只显示 [商品ID] = 1
:
ALLNOBLANKROW('商品表'[商品ID])
返回{1, 2, 3}
(清除筛选,且去除空白值)。- 若用
ALL('商品表'[商品ID])
则返回{1, 2, 3, BLANK}
(保留空白值)。
4. 适用场景
- 计算 “占比” 时排除空白值影响:
例如计算某商品销售额占所有非空白商品总销售额的比例:dax
商品销售占比 = DIVIDE(SUM('销售表'[销售额]),CALCULATE(SUM('销售表'[销售额]), ALLNOBLANKROW('商品表'[商品ID])) )
- 清除筛选时需要自动排除空白行(避免空白值干扰计算)。
三、DISTINCT
与 ALLNOBLANKROW
的核心区别
维度 | DISTINCT | ALLNOBLANKROW |
---|---|---|
核心功能 | 对列或表进行去重(保留空白值) | 清除筛选并返回非空白的完整值集(去除空白值) |
筛选上下文影响 | 受当前筛选上下文影响(只对筛选后的数据去重) | 忽略所有筛选上下文(返回基础数据中的非空白值) |
空白值处理 | 保留空白值(Blank) | 自动去除空白值(Blank) |
返回结果范围 | 仅包含当前上下文或表中实际存在的去重值 | 包含基础数据中所有非空白值(无论是否在当前筛选中) |
典型用途 | 统计当前筛选下的不重复值(如当前分类下的商品种类) | 计算整体占比、基准值(如所有非空白商品的总销售额) |
四、对比示例:更直观的区别
假设场景:'商品表'
有 [商品ID] = {1, 2, 3, BLANK}
,当前筛选器只选择了 [商品ID] = 1
和 2
。
DISTINCT('商品表'[商品ID])
- 结果:
{1, 2}
(受当前筛选影响,返回筛选后的去重值,此处无空白值)。 - 逻辑:只对筛选后的结果去重。
- 结果:
ALLNOBLANKROW('商品表'[商品ID])
- 结果:
{1, 2, 3}
(忽略当前筛选,返回基础数据中所有非空白值)。 - 逻辑:清除筛选,且排除空白值。
- 结果:
若当前筛选包含空白值(如筛选后
[商品ID] = 1, BLANK
):DISTINCT('商品表'[商品ID])
返回{1, BLANK}
(保留空白值)。ALLNOBLANKROW('商品表'[商品ID])
仍返回{1, 2, 3}
(始终排除空白值)。
总结
DISTINCT
是 “在当前筛选范围内去重,保留空白”,用于获取可见数据中的唯一值。ALLNOBLANKROW
是 “忽略所有筛选,返回基础数据中的非空白完整值集”,用于计算不受筛选影响的基准值(如总占比)。- 记住:
DISTINCT
受筛选影响且保留空白,ALLNOBLANKROW
不受筛选影响且去除空白,这是二者最核心的区别。