当前位置: 首页 > news >正文

第12篇:DAX 高级计算与性能优化

第12篇:DAX 高级计算与性能优化

1. DAX 计算上下文深度理解

1.1 行上下文

遍历表的每一行,可访问当前行的字段值:

// 计算列中使用行上下文 利润率 = Sales[Profit] / Sales[Amount] // 迭代函数中使用行上下文 总利润 = SUMX(Sales, Sales[Quantity] * Sales[UnitPrice] - Sales[Cost])

1.2 筛选上下文

由外部筛选器、切片器、关系决定:

// CALCULATE 修改筛选上下文 大额订单数 = CALCULATE( COUNTROWS(Sales), Sales[Amount] > 10000 )

1.3 上下文转换

行上下文 → 筛选上下文:

// 在迭代函数中使用度量值 总销售额 = SUMX(Sales, [销售额]) // 自动上下文转换 // 等价于 总销售额 = SUMX(Sales, CALCULATE(SUM(Sales[Amount])))

2. CALCULATE 高级用法

2.1 修改筛选器

// ALL - 移除筛选 总占比 = DIVIDE( [销售额], CALCULATE([销售额], ALL(Sales)) ) // ALLEXCEPT - 保留指定列 类别占比 = DIVIDE( [销售额], CALCULATE([销售额], ALLEXCEPT(Sales, Product[Category])) ) // ALLSELECTED - 基于用户选择 视觉对象占比 = DIVIDE( [销售额], CALCULATE([销售额], ALLSELECTED(Sales)) )

2.2 添加筛选器

// 添加新筛选 电子产品销售额 = CALCULATE( [销售额], Product[Category] = "电子产品" ) // 复合筛选 高价值订单 = CALCULATE( [销售额], Sales[Amount] > 1000, Product[Category] = "电子产品" || Product[Category] = "家居" )

2.3 筛选器覆盖规则

// 相同列的筛选器会覆盖 度量值 = CALCULATE( [销售额], Product[Category] = "电子产品", // 会覆盖外部筛选 ALL(Product[Category]) ) // 不同列的筛选器会叠加 度量值 = CALCULATE( [销售额], Product[Category] = "电子产品", Product[Color] = "黑色" )

3. 时间智能函数详解

3.1 标准时间智能

// 累计年初至今 YTD销售额 = TOTALYTD([销售额], Date[Date]) // 等价写法 YTD销售额 = CALCULATE( [销售额], DATESYTD(Date[Date]) ) // 上年同期 去年同期销售额 = CALCULATE( [销售额], SAMEPERIODLASTYEAR(Date[Date]) ) // 上月 上月销售额 = CALCULATE( [销售额], DATEADD(Date[Date], -1, MONTH) )

3.2 灵活时间计算

// 最近N天 最近30天销售额 = CALCULATE( [销售额], DATESINPERIOD( Date[Date], MAX(Date[Date]), -30, DAY ) ) // N个季度移动平均 季度移动平均 = CALCULATE( AVERAGEX( VALUES(Date[Quarter]), [销售额] ), DATESINPERIOD( Date[Date], MAX(Date[Date]), -4, QUARTER ) )

3.3 工作日计算

// 计算工作日数 工作日数 = CALCULATE( COUNTROWS(Date), Date[IsWorkday] = TRUE, DATESINPERIOD(Date[Date], MAX(Date[Date]), -1, MONTH) ) // 工作日平均销售额 工作日日均 = DIVIDE( [月销售额], [工作日数] )

4. 高级聚合函数

4.1 SUMX / AVERAGEX 迭代

// 加权平均单价 加权平均单价 = DIVIDE( SUMX(Sales, Sales[Quantity] * Sales[UnitPrice]), SUM(Sales[Quantity]) ) // 迭代计算利润 总利润 = SUMX( Sales, Sales[Quantity] * (Sales[UnitPrice] - Sales[UnitCost]) )

4.2 MAXX / MINX 最值计算

// 最大单笔订单 最大订单金额 = MAXX(Sales, Sales[Amount]) // 各产品最大日销量 产品最大日销量 = MAXX( VALUES(Date[Date]), CALCULATE(SUM(Sales[Quantity])) )

4.3 RANKX 排名

// 产品销售额排名 产品排名 = RANKX( ALL(Product[ProductName]), [销售额], , DESC, DENSE ) // 分类内排名 分类内排名 = RANKX( ALLEXCEPT(Product, Product[Category]), [销售额], , DESC, DENSE )

5. 筛选器函数进阶

5.1 FILTER vs 直接筛选

// 方式1:直接筛选(推荐) 销售额A = CALCULATE( [销售额], Product[Category] = "电子产品" ) // 方式2:FILTER(复杂逻辑) 销售额B = CALCULATE( [销售额], FILTER( Product, Product[Category] = "电子产品" && Product[Price] > 100 ) )

5.2 KEEPFILTERS

保持现有筛选器,而非覆盖:

// 不使用 KEEPFILTERS(会覆盖) 错误计算 = CALCULATE( [销售额], Product[Color] IN {"红色", "蓝色"} ) // 使用 KEEPFILTERS(叠加) 正确计算 = CALCULATE( [销售额], KEEPFILTERS(Product[Color] IN {"红色", "蓝色"}) )

5.3 TREATAS

虚拟关系,无需物理关系:

// 假设有一个与事实表无关系的预算表 预算达成率 = DIVIDE( [销售额], CALCULATE( SUM(Budget[Amount]), TREATAS(VALUES(Product[Category]), Budget[Category]), TREATAS(VALUES(Date[Month]), Budget[Month]) ) )

6. 性能优化技巧

6.1 使用 DAX Studio 分析

// 查看查询计划和存储引擎查询 EVALUATE CALCULATETABLE( VALUES(Product[Category]), [销售额] > 100000 )

6.2 减少迭代次数

// 慢 - 迭代整个表 总金额1 = SUMX(Sales, Sales[Quantity] * Sales[UnitPrice]) // 快 - 预先计算列 // 在 Power Query 中添加 Amount = Quantity * UnitPrice 总金额2 = SUM(Sales[Amount])

6.3 避免复杂计算列

// 计算列(性能差) 相关产品数 = CALCULATE( COUNTROWS(Product), Sales[ProductID] = EARLIER(Sales[ProductID]) ) // 度量值(性能好) 相关产品数 = CALCULATE( COUNTROWS(Product), FILTER( ALL(Sales), Sales[ProductID] = SELECTEDVALUE(Sales[ProductID]) ) )

6.4 变量优化

// 不使用变量(重复计算) 增长率 = DIVIDE( [销售额] - CALCULATE([销售额], SAMEPERIODLASTYEAR(Date[Date])), CALCULATE([销售额], SAMEPERIODLASTYEAR(Date[Date])) ) // 使用变量(计算一次) 增长率 = VAR CurrentSales = [销售额] VAR LastYearSales = CALCULATE([销售额], SAMEPERIODLASTYEAR(Date[Date])) RETURN DIVIDE(CurrentSales - LastYearSales, LastYearSales)

7. 常见性能问题

7.1 高基数列问题

问题解决方案
高基数列减少使用,或分区处理
DateTime 列使用整数日期键
GUID 列避免用于关系

7.2 复杂筛选器

// 慢 - 复杂筛选 慢查询 = CALCULATE( [销售额], FILTER( Product, LEN(Product[Name]) > 10 ) ) // 快 - 简化筛选 快查询 = CALCULATE( [销售额], Product[NameLength] > 10 // 预计算列 )

7.3 过度使用度量值

// 每个度量值都独立计算 总度量值1 = [销售额] + [成本] + [利润] // 改用变量合并计算 总度量值2 = VAR Sales = [销售额] VAR Cost = [成本] VAR Profit = [利润] RETURN Sales + Cost + Profit

8. 调试技巧

8.1 逐步验证

// 使用变量分段调试 调试度量值 = VAR Step1 = CALCULATE([销售额], ALL(Date)) VAR Step2 = CALCULATE([销售额], ALLEXCEPT(Date, Date[Year])) VAR Step3 = [销售额] RETURN Step3 // 逐步替换检查

8.2 查看筛选上下文

// 返回当前筛选条件 当前筛选 = CONCATENATEX( FILTER( ALLSELECTED(Product[Category]), ISFILTERED(Product[Category]) ), Product[Category], ", " )

9. 最佳实践总结

✅ 优先使用变量 ✅ 简化筛选器逻辑 ✅ 减少迭代范围 ✅ 用度量值替代计算列 ✅ 使用 DAX Studio 分析 ✅ 时间智能需有连续日期表 ❌ 避免嵌套 CALCULATE ❌ 避免大表迭代 ❌ 避免高基数计算列 ❌ 避免过度度量值依赖

10. 小结

本篇介绍了 DAX 高级计算:

主题要点
计算上下文行上下文 vs 筛选上下文
CALCULATE修改、添加、覆盖筛选
时间智能YTD、SAMEPERIODLASTYEAR
迭代函数SUMX、RANKX、FILTER
性能优化变量、减少迭代、避免计算列

下一篇,我们将探讨高级可视化与自定义图表。

http://www.jsqmd.com/news/696694/

相关文章:

  • Python正则表达式之基础篇
  • LFM2.5-VL-1.6B快速上手:Gradio WebUI本地部署与常见报错解决指南
  • 2026不锈钢隔断厂家专业度排行:办公楼卫生间隔断、医院卫生间隔断、卫生间隔断材料、商场卫生间隔断、学校卫生间隔断选择指南 - 优质品牌商家
  • 报道 | 2026年5月-2026年7月国际运筹优化会议汇总
  • CoPaw问题解决:部署常见错误排查与多平台接入配置详解
  • 3分钟快速上手:ncmdump终极NCM文件转换完整指南
  • React Grab:打通视觉与代码层,3倍提升AI编程效率
  • 马斯克开大,600亿重金收购Cursor
  • SD3.5 FP8镜像测评:图像质量提升,生成速度更快
  • 第13篇:高级可视化与自定义图表
  • 2026四川充电设备技术解析:四川充电桩升级改造、四川充电桩生产企业、四川充电设备厂家、四川充电设备安装、四川充电设备采购选择指南 - 优质品牌商家
  • 手把手教你搞定DSP与FPGA的EMIF通信:基于TM320C6747和Xilinx 7系列的真实项目调试笔记
  • 时间序列预测中的特征工程与机器学习应用
  • 别再到处找了!GNN入门必备的12个经典图数据集(Cora/Citeseer/Pubmed等)打包下载与一键读取教程
  • 图像识别化技术中的目标检测图像分割与特征提取
  • PP-DocLayoutV3处理扫描合同:关键信息抽取与风险点标注
  • 参数统计假设检验:原理、Python实现与机器学习应用
  • TensorFlow-v2.15镜像扩展实战:快速集成数据分析三件套
  • UniApp多租户商城源码|支持H5、小程序、APP三端发布|含SpringBoot+Vue后台
  • 在嵌入式设备上实现AES-128-CBC:资源受限环境下的C语言加密方案
  • XGBoost学习曲线分析与调参实战指南
  • Diligent在Elevate 2026大会上推出AI董事及智能代理GRC团队
  • 告别传感器毛刺!手把手教你用C++/C实现滑动窗口滤波(附完整代码)
  • 论文AI率太高怎么办实测解法:多方案横评,降重鸟稳居第一
  • Rust的闭包捕获
  • HARDBOILED IR:面向张量计算的编译器优化设计
  • Qwen3.5-2B应用场景:政府公文OCR识别+政策要点提炼+口语化解读
  • 3DMAX新手必看:免费插件ForestPackLite快速上手,5分钟搞定场景绿化
  • Airweave:声明式AI数据编织框架的设计与实战
  • AI与机器学习:概念差异与技术应用解析