惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

V
Vulnerabilities – Threatpost
aimingoo的专栏
aimingoo的专栏
B
Blog
H
Hackread – Cybersecurity News, Data Breaches, AI and More
GbyAI
GbyAI
阮一峰的网络日志
阮一峰的网络日志
Engineering at Meta
Engineering at Meta
IT之家
IT之家
V
Visual Studio Blog
The Cloudflare Blog
酷 壳 – CoolShell
酷 壳 – CoolShell
A
About on SuperTechFans
博客园 - 聂微东
Blog — PlanetScale
Blog — PlanetScale
N
News and Events Feed by Topic
A
Arctic Wolf
WordPress大学
WordPress大学
小众软件
小众软件
C
CERT Recently Published Vulnerability Notes
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
D
Darknet – Hacking Tools, Hacker News & Cyber Security
F
Fortinet All Blogs
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
Y
Y Combinator Blog
T
Threat Research - Cisco Blogs
Latest news
Latest news
Simon Willison's Weblog
Simon Willison's Weblog
Cyberwarzone
Cyberwarzone
S
Schneier on Security
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
L
Lohrmann on Cybersecurity
Stack Overflow Blog
Stack Overflow Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
P
Privacy International News Feed
J
Java Code Geeks
Spread Privacy
Spread Privacy
宝玉的分享
宝玉的分享
I
Intezer
L
LangChain Blog
Hacker News - Newest:
Hacker News - Newest: "LLM"
G
GRAHAM CLULEY
博客园 - 叶小钗
博客园 - 三生石上(FineUI控件)
The GitHub Blog
The GitHub Blog
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
N
News and Events Feed by Topic
AWS News Blog
AWS News Blog
Attack and Defense Labs
Attack and Defense Labs
Security Archives - TechRepublic
Security Archives - TechRepublic
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO

博客园 - 哥本哈士奇(aspnetx)

Raw Data Vault vs Business Data Vault Neo4j 多跳查询实战:从社交网络场景理解图遍历 Git 本地版本管理学习笔记 看完《低智商犯罪》,学习Cypher构建知识图谱 LangChain DeepAgents 学习笔记 LangChain Deepagent 版本0.6.1中间件一个bug Neo4j笔记(五):查询的处理流程 微软 SQL Server 版本演进史:从诞生到 SQL Server 2025 提升 Text2SQL 准确率 SQLServer Management Studio(SSMS) 22 Copilot 最佳实践学习笔记 SQLServer RAG笔记4:从服务层到前端交互 SQLServer RAG笔记5:为SQLServer 2025配置Ollama SQL Server RAG 笔记3:SQLServer2025 向量数据库 详解传统RAG、Text2SQL、Graph RAG:适用场景与问题示例汇总 SQL Server RAG 笔记2:图数据库服务层与前端可视化构建 SQL Server RAG 笔记1:图数据库构建 Neo4j 笔记(四):一篇文章如何入库的 数据仓库笔记 第六篇:PSA 层 SCD2 处理方式 数据仓库笔记 第五篇:Data Mart 层(数据集市) 数据仓库笔记 第四篇:Star Schema 层(维度建模) 数据仓库笔记 第三篇:常用缓慢变化维处理方式介绍 数据仓库笔记 第二篇:PSA 层(持久化暂存区)详解 数据仓库笔记 第一篇:数据仓库的定义、历史与意义 Neo4j 笔记(三):数据建模与程序连接实战 Neo4j 基础教程(二):Cypher CRUD 完全指南 Neo4j 基础教程(一):安装与快速入门 Power BI学习笔记第20篇:面试题汇总 · 第三篇:高级应用与最佳实践篇 Power BI学习笔记第19篇:面试题汇总 · 第二篇:数据建模与 DAX 篇 Power BI学习笔记第18篇:面试题汇总 · 第一篇:基础概念篇 Power BI学习笔记第15篇:企业级报表开发与最佳实践 Power BI学习笔记第13篇:高级可视化与自定义图表 Power BI学习笔记第14篇:Power Query 高级数据处理 Power BI学习笔记第11篇:高级数据建模与关系设计 Power BI学习笔记第10篇:实战案例 — 销售数据分析仪表板 Power BI学习笔记第08篇:报表交互与筛选器 Power BI学习笔记第09篇:Power BI Service 发布与共享 Power BI学习笔记第07篇:可视化图表设计与最佳实践 Power BI学习笔记第06篇:DAX 进阶:时间智能与复杂计算 Power BI学习笔记第05篇:DAX 基础:计算列与度量值 Power BI学习笔记第04篇:数据建模与关系管理 Power BI学习笔记第03篇:Power Query 数据清洗与转换 Power BI学习笔记第02篇:数据获取与连接数据源 Power BI学习笔记第01篇:Power BI 简介与环境搭建 Power BI Dashboard 常用布局方案推荐 Power BI 示例一览 OpenClaw 核心八大 MD 文件 Microsoft Agent Framework 智能体调用工具 Microsoft Agent Framework 创建智能体 一个简单案例理解OpenClaw的做梦过程 SQLAlchemy 学习笔记 LangChain RAG索引与查询 - 学习笔记 LangChain使用deep agent并且加载SKILL 本地系统对接大模型智能体的若干尝试 财务分析报告 - 常用Power BI DAX公式详解 用SKILL实现请假流程信息收集 使用小龙虾来操作猿编程的遥控车 使用OpenClaw的Skills对接本地系统 OpenClaw必装Skill全指南 Dify Agentic RAG 笔记 # 简单的神经网络计算过程 - 正负判断 使用Gradio构建AI前端 - RAG的QA模块 使用Gradio构建AI前端 - RAG召回测试 Streamlit + LangChain 1.0 简单实现智能问答前后端 利用AI Agent,辅助销售团队制定培训和考试内容 实现AI和BI整合的初步思路和探索-Part3 实现AI和BI整合的初步思路和探索-Part2 实现AI和BI整合的初步思路和探索 以《出师表》作为例子,对比通用分块和父子分块的区别 LangChain RAG 学习笔记:从文档加载到问答服务 记录无法修改OneDrive文件的解决方法 Power BI制作指标达成跟踪器 Power BI学习笔记-周报销售数据分析
Power BI学习笔记第12篇:DAX 高级计算与性能优化
哥本哈士奇(aspnet · 2026-04-25 · via 博客园 - 哥本哈士奇(aspnetx)

第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
性能优化 变量、减少迭代、避免计算列

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