Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >PowerBI DAX 用 SUBSTITUTEWITHINDEX 为表增加索引

PowerBI DAX 用 SUBSTITUTEWITHINDEX 为表增加索引

作者头像
BI佐罗
发布于 2021-05-27 02:30:38
发布于 2021-05-27 02:30:38
1.9K00
代码可运行
举报
文章被收录于专栏:PowerBI战友联盟PowerBI战友联盟
运行总次数:0
代码可运行

这是一个非常重要的技巧,重要到:涉及到性能优化的重要技巧。

理论基础

我们是给业务人员用白话来讲解深刻的技术技巧的。作为业务,不必担心。

在很多场景下,我们需要某个表是按照某列预先排过序的,这有很多好处。

也就是说:预先排序,是一个在计算中用到的重要技巧。

请先直接记住吧。

数据库的各种优化中,加索引是一种特别常见而立竿见影的优化方法。当然,在做某些事情时,也需要增加索引。

动态增加索引

业务人员会问:为什么要在 DAX 中增加索引呢?为什么不预先在 Power Query 中增加一个索引呢?

这样的问题表示:还没有入门 DAX。

入门 DAX 后,会知道:计算总是在用户选择后发生的。

也就是说,如果计算中涉及到增加索引,那么应该是在用户选择以后,那么这种在用户选择以后的计算,我们说它依赖于用户的选择,无法提前预知,所以称为:动态的。

因此,DAX 必须提供一个函数来为用户选择以后的表来添加索引。

理解 SUBSTITUTEWITHINDEX

该函数顾名思义,用索引替代之用,更好的来解释这个函数为:

SUBSTITUTE (X) WITHINDEX (Y)

也就是说,使用(Y)来替代(X)。

该函数并不直接解决任何业务问题,但却是很多问题处理的中间手段。

在实际中,与替换元素为索引相比,为元素增加索引,更加常见。这里统一说明。

也就是说,有两种场景定式,一定用该函数解决:

场景一:用数字索引替换某个已经存在的列

场景二:为一个表增加一个数字索引列

用法

SUBSTITUTEWITHINDEX (主表,新增的索引列名,参考表,参考表 [某列] , 排序,... )

解释:在主表中新增一列,增加的这列会替代主表与参考表的公有列,新增的列值将依据【参考表 [某列]】按【排序】方式来进行。该函数的名称和用法比较不易理解,需要参考示例再充分理解。

示例

对 SUBSTITUTEWITHINDEX 的使用场景分为两种情况:

  • 【场景 1】将元素替代为序号,元素重复则序号重复,替换后,元素不保留。
  • 【场景 2】为元素新增加序号,元素重复则序号重复,替换后,元素要保留。

场景 1 - 将元素替代为序号

直接复制如下内容,建立计算表。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
T = 

// 目的:将明细表的某列替换为索引,若该列有重复项,重复项的索引号相同。

// 构建一个明细表,有重复项
VAR FactTable = SELECTCOLUMNS( { "D" , "A" , "C" , "B" , "B" , "A" , "D" , "D" } , "Item" , [Value] )

// 从明细表提出主表,元素唯一化
VAR MasterTable = DISTINCT( SELECTCOLUMNS( FactTable , "Item" , [Item] ) )

// 为明细表建立一个索引列替换在主表中出现的列,并按主表的列排序
RETURN SUBSTITUTEWITHINDEX( FactTable , "Index" , MasterTable , [Item] , ASC )
    

结果如下:

可见:原有的元素被替换为了序号。

场景 2 - 为元素新增序号

直接复制如下内容,建立计算表。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
T = 

// 目的:为明细表按某列添加索引,若该列有重复项,重复项的索引号相同。

// 构建一个明细表,有重复项
VAR FactTable = SELECTCOLUMNS( { "D" , "A" , "C" , "B" , "B" , "A" , "D" , "D" } , "Item" , [Value] )

// 为明细表添加 索引元素,与 原元素 相同
VAR FactWithIndex = ADDCOLUMNS( FactTable , "Index" , [Item] )

// 从明细表提出主表,元素唯一化
VAR MasterTable = DISTINCT( SELECTCOLUMNS( FactTable , "Index" , [Item] ) )

// 为明细表建立一个索引列替换明细表中在主表出现的列,并按主表的列排序
RETURN SUBSTITUTEWITHINDEX( FactWithIndex , "Index" , MasterTable , [Index] , ASC )

效果如下:

可见:为原有的元素增加了一个索引列。

总结

SUBSTITUTEWITHINDEX 虽然用于添加了索引列,但其真正语义在于:替换,因此,精确地讲,不是增加索引列,而是创建索引列并替换原有匹配的列。

在目前看来,SUBSTITUTEWITHINDEX 似乎什么都没有做,但我们此前的一些重要算法和未来的重要算法都将基于这个函数来实现。

请业务人员记忆以下套路:

第一步:有一个明细表

第二步:从明细表抽出主表(参考表)

第三步:替换(SUBSTITUTE)明细表的列 X 为(WITH)索引号(INDEX)参照参考表进行

在实际操作中有两个定式:

一个是:替换为序号,不保留原来元素。

一个是:增加新序号,且保留原来元素。

这个函数有多强大,参考:【无敌】PowerBI 终极算法性能优化 最强版

如果你想变得更强大,参考:BI真经 - 让数据真正成为你的力量

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-05-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 PowerBI战友联盟 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
函数周期表丨筛选丨表丨SUBSTITUTEWITHINDEX
这样的话做出来的维度没有索引,也就是并没有一个让中文字段排序的列,这样其实很麻烦的。倒是可以通过添加计算列,利用EARLIER函数处理,但是略显繁琐了。
PowerBI丨白茶
2021/08/31
5640
函数周期表丨筛选丨表丨SUBSTITUTEWITHINDEX
Power BI DAX 求最大连续元素数的最佳实践
在此前的文章中已经给出了 Power BI 使用 DAX 求最大连续元素数的方法。
BI佐罗
2023/03/01
1.4K0
Power BI DAX 求最大连续元素数的最佳实践
PowerBI DAX 性能优化 高级视图算法 超越经典 性能提升成千上万倍
小伙伴催更了。准备放大招,所以,很多内容停滞了。如果本文的技巧让您震撼,那如果告诉您,本文仅仅是开胃菜呢。开始吹吧。
BI佐罗
2020/08/11
1.3K0
PowerBI DAX 性能优化 高级视图算法 超越经典 性能提升成千上万倍
用 DAX 快速构建一个日期表
这里所说的 DAX 知识基础,不仅仅是理解什么是日期表,更多的是知道日期表如何构建可以兼顾到很多使用上的场景。
BI佐罗
2022/01/27
2.8K0
用 DAX 快速构建一个日期表
【无敌】PowerBI 终极算法性能优化 最强版
最近,有网友发来信息,称实现了超过我们此前公布的算法。牛了,都优化了10万倍性能了还能被超越。晕~~
BI佐罗
2019/09/23
8940
【无敌】PowerBI 终极算法性能优化 最强版
​PowerBI DAX RANKX 详解
很多小伙伴问罗叔,虽然在网上找了大量教程,但到底如何理解 RANKX 还是没有找到好的方法,这篇文章就彻底把 RANKX 给大家讲清楚。很多高手也会认为自己理解了 RANKX,但遇到复杂问题了还是会掉链子,让我们结合一些问题来看一看。
BI佐罗
2020/07/02
4.6K1
彻底理解 PowerBI DAX 函数 EARLIER
例如:我们有一个集合:{ 1, ... , 10 },对这个集合的遍历,就是挨个看一遍。
BI佐罗
2021/02/08
2.4K1
PowerBI 实现超多系列对比分析 - 下篇 - 方案实现
该模型可以反应随着时间的发展,多品牌,多SKU,多地区等表示任何多系列的元素的发展。
BI佐罗
2021/02/09
1.7K0
PowerBI 全网首发原生平滑曲线 - 通用模板及应用
我们都知道,在给出年月计算新老客户以及活跃用户数是相对比较复杂的计算,我们来看看最终效果:
BI佐罗
2021/02/08
9680
【DAX 系列】总计行问题终极解决方案
这是一个老生常谈的问题,本文将给你终极解决方案,并带您重新理解一种模式,从入门级到专业级,均有您需要的营养。
BI佐罗
2020/02/17
3.8K0
【DAX 系列】总计行问题终极解决方案
全网首发 Power BI DAX 纯原生高性能分页矩阵
在 Power BI 中显示一个大型的表,并不擅长,因为 Power BI 更倾向于制作高度聚合的可视化图表,但如果就是希望做到可以显示大篇幅的分页表格怎么办呢?本文就是来给出答案的。
BI佐罗
2021/03/25
2.6K0
全网首发 Power BI DAX 纯原生高性能分页矩阵
PowerBI DAX 如何使用变量表里的列
这里是希望表达计算销售额,但会遭遇一个语法错误,这里不能使用 vTable[LineSellout] 。
BI佐罗
2021/09/17
4.4K0
PowerBI 零基础支持上百指标多日期切换分析模板
本案例有着强大而非常实用的业务背景,几乎适用于任何规模和发展阶段的企业,而使用者却根本不需要理解什么是PowerBI或商业智能,使用者只需要自己的业务指标是什么,什么时候该被考察,以及基于常识性的点击鼠标就可以看到所需要的洞察力。
BI佐罗
2019/09/23
3.4K1
PowerBI 零基础支持上百指标多日期切换分析模板
PowerBI DAX 表连续运算及上下文转换失效
DAX 中的表有两类:基表(base table)以及用作临时用途的表(table)。参考:DAX 中的表。
BI佐罗
2021/05/27
1.2K0
Thinking in DAX with PowerBI - 逻辑框架 - 计算逻辑
有过大学计算机相关背景的伙伴会非常清楚:数据结构和算法,是一个程序员(软件开发工程师)的绝对内功心法。
BI佐罗
2020/10/19
1.6K0
东哥陪你学PowerBI——通过RFM模型分析客户价值
本章通过分析某店铺会员消费数据,将每个会员的R、F、M得分值与平均值做对比 (每个要素好于平均值记为A,比平均值差记为B), 将会员分为以下八种,以便针对性做营销决策,实现精细化运营
公众号PowerBI大师
2020/04/14
2K1
东哥陪你学PowerBI——通过RFM模型分析客户价值
PowerBI DAX 新函数 OFFSET
如果我们希望在透视表的另一列可以获取前一列的上一项的值,该怎么做呢?这个问题在以前需要做定位。而有了新的函数 OFFSET 可以简化这个过程。如下:
BI佐罗
2022/12/18
2K0
PowerBI DAX 新函数 OFFSET
PowerBI: 使用计算组功能计算不同度量值的同比、环比
文章背景: 在进行商业数据分析时,经常需要给不同的度量值(如销售额、销量等)计算同比、环比、YTD(年初至今)等指标,如果给每个指标都写一个以上的时间智能函数,那么会写很多重复的度量值,这些度量值的唯一不同就在于引用的基础度量值。比如:上月业绩 = CALCULATE([销售业绩],DATEADD('日期表'[日期],-1,MONTH))。
Exploring
2022/12/18
4K0
PowerBI: 使用计算组功能计算不同度量值的同比、环比
PowerBI 中处理重复排名,展示TOPN
业务中,常常需要显示 TOP N 的排名前几的产品(或门店,区域)和销售额(或其他指标)。尴尬的问题在于,如果指标的大小一样,会出现重复的元素的情况。例如:
BI佐罗
2022/12/18
2.1K0
PowerBI 中处理重复排名,展示TOPN
如何实现 DAX 按指定顺序拼接字符串
如果你正在学习 DAX,那么这又是一个非常好的案例可以帮助你理解 DAX 很多妙处。
BI佐罗
2021/12/01
1.5K0
如何实现 DAX 按指定顺序拼接字符串
推荐阅读
相关推荐
函数周期表丨筛选丨表丨SUBSTITUTEWITHINDEX
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验