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

推荐订阅源

Google DeepMind News
Google DeepMind News
人人都是产品经理
人人都是产品经理
S
Securelist
P
Proofpoint News Feed
H
Help Net Security
S
Schneier on Security
T
Tenable Blog
C
Cisco Blogs
S
Security @ Cisco Blogs
博客园 - 司徒正美
博客园 - 叶小钗
Cisco Talos Blog
Cisco Talos Blog
Google DeepMind News
Google DeepMind News
C
Cybersecurity and Infrastructure Security Agency CISA
Google Online Security Blog
Google Online Security Blog
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
Hacker News: Ask HN
Hacker News: Ask HN
NISL@THU
NISL@THU
云风的 BLOG
云风的 BLOG
V
Vulnerabilities – Threatpost
T
The Blog of Author Tim Ferriss
aimingoo的专栏
aimingoo的专栏
W
WeLiveSecurity
www.infosecurity-magazine.com
www.infosecurity-magazine.com
Jina AI
Jina AI
腾讯CDC
WordPress大学
WordPress大学
Simon Willison's Weblog
Simon Willison's Weblog
Vercel News
Vercel News
小众软件
小众软件
N
Netflix TechBlog - Medium
有赞技术团队
有赞技术团队
AWS News Blog
AWS News Blog
雷峰网
雷峰网
Forbes - Security
Forbes - Security
The Hacker News
The Hacker News
博客园 - 聂微东
F
Full Disclosure
量子位
Scott Helme
Scott Helme
宝玉的分享
宝玉的分享
A
About on SuperTechFans
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
Schneier on Security
Schneier on Security
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
K
Kaspersky official blog
AI
AI
SecWiki News
SecWiki News
Webroot Blog
Webroot Blog
Martin Fowler
Martin Fowler

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

SQL Server 索引知识汇总 医疗器械行业 Salesforce Territory 完整落地实例 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学习笔记第12篇:DAX 高级计算与性能优化 Power BI学习笔记第11篇:高级数据建模与关系设计 Power BI学习笔记第10篇:实战案例 — 销售数据分析仪表板 Power BI学习笔记第08篇:报表交互与筛选器 Power BI学习笔记第09篇:Power BI Service 发布与共享 Power BI学习笔记第07篇:可视化图表设计与最佳实践 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学习笔记第06篇:DAX 进阶:时间智能与复杂计算
哥本哈士奇(aspnet · 2026-04-25 · via 博客园 - 哥本哈士奇(aspnetx)

第06篇:DAX 进阶:时间智能与复杂计算

1. 时间智能概述

时间智能(Time Intelligence)是 DAX 中专门用于处理日期和时间的强大功能,让你可以轻松计算同比、环比、年累计、月累计等分析指标。

时间智能的前提:模型中必须有一张日期表(Date Table),且与事实表建立了关系。


2. 建立日期表

日期表是时间智能的基础,必须满足以下条件:

  • 包含从起始日期到结束日期的连续日期序列
  • 每行对应一天,无遗漏
  • 日期列是唯一值(不能有重复日期)

2.1 使用 DAX 自动创建日期表

日期表 = 
CALENDAR(
    DATE(2020, 1, 1),   -- 起始日期
    DATE(2025, 12, 31)   -- 结束日期
)

这会生成一个包含所有日期的表。

2.2 创建带年/月/季度列的完整日期表

日期表 = 
ADDCOLUMNS(
    CALENDAR(DATE(2020,1,1), DATE(2025,12,31)),
    "年", YEAR([Date]),
    "季度", "Q" & QUARTER([Date]),
    "月", FORMAT([Date], "yyyy-MM"),
    "月份名称", FORMAT([Date], "MMMM"),
    "星期", WEEKDAY([Date]),
    "年度第几周", WEEKNUM([Date])
)

2.3 标记日期表

建立日期表后,必须将其标记为日期表:

  1. 在数据视图中,选中日期表
  2. 点击"表格工具" → "标记为日期表" → 选择日期列

3. 常用时间智能函数

3.1 TOTALYTD / TOTALQTD / TOTALMTD

年累计(Year-to-Date)

销售额_YTD = TOTALYTD(SUM(销售[销售额]), '日期表'[Date])

季度累计(Quarter-to-Date)

销售额_QTD = TOTALQTD(SUM(销售[销售额]), '日期表'[Date])

月累计(Month-to-Date)

销售额_MTD = TOTALMTD(SUM(销售[销售额]), '日期表'[Date])

3.2 SAMEPERIODLASTYEAR(去年同期)

销售额_去年同期 = 
CALCULATE(
    SUM(销售[销售额]),
    SAMEPERIODLASTYEAR('日期表'[Date])
)

3.3 PARALLELPERIOD(平移周期)

将日期平移指定月数或季度:

-- 上年同期(与SAMEPERIODLASTYEAR效果类似)
销售额_上年同期 = 
CALCULATE(
    SUM(销售[销售额]),
    PARALLELPERIOD('日期表'[Date], -1, YEAR)
)

-- 上月同期
销售额_上月同期 = 
CALCULATE(
    SUM(销售[销售额]),
    PARALLELPERIOD('日期表'[Date], -1, MONTH)
)

4. 同比与环比计算

4.1 同比增长率(YoY)

销售额_同比增长率 = 
DIVIDE(
    [销售额] - [销售额_去年同期],
    [销售额_去年同期]
)

4.2 环比增长率(MoM)

-- 先计算上月销售额
销售额_上月 = 
CALCULATE(
    SUM(销售[销售额]),
    PARALLELPERIOD('日期表'[Date], -1, MONTH)
)

-- 环比增长率
销售额_环比增长率 = 
DIVIDE(
    [销售额] - [销售额_上月],
    [销售额_上月]
)

4.3 季度环比

销售额_上季 = 
CALCULATE(
    SUM(销售[销售额]),
    PARALLELPERIOD('日期表'[Date], -1, QUARTER)
)

销售额_季度环比 = 
DIVIDE([销售额] - [销售额_上季], [销售额_上季])

5. 移动平均

使用 AVERAGEX 配合 DATESINPERIOD 计算移动平均:

-- 7日移动平均
销售额_7日移动平均 = 
AVERAGEX(
    DATESINPERIOD('日期表'[Date], LASTDATE('日期表'[Date]), -7, DAY),
    CALCULATE(SUM(销售[销售额]))
)
-- 12个月移动平均
销售额_12月移动平均 = 
AVERAGEX(
    DATESINPERIOD('日期表'[Date], LASTDATE('日期表'[Date]), -12, MONTH),
    CALCULATE(SUM(销售[销售额]))
)

6. 复杂计算进阶

6.1 RANKX 排名

-- 按销售额排名(降序)
产品销售排名 = 
RANKX(
    ALL(产品[产品名称]),
    [销售额],
    ,
    DESC,
    DENSE
)

参数说明:ALL(产品[产品名称]) 定义排名的范围,DESC 表示降序,DENSE 表示dense排名(无跳号)。

6.2 TOPN 取前N名

销售额前3产品 = 
TOPN(
    3,
    ALL(产品[产品名称]),
    [销售额],
    DESC
)

6.3 HASONEVALUE 单值判断

-- 仅在选择了单一产品时才显示百分比
产品销售占比 = 
IF(
    HASONEVALUE(产品[产品名称]),
    DIVIDE([销售额], CALCULATE([销售额], ALL(产品))),
    BLANK()
)

6.4 使用变量(VAR)优化性能

利润率_同比变化 = 
VAR CurrentMargin = [利润率]
VAR LastYearMargin = [利润率_去年同期]
RETURN
    DIVIDE(CurrentMargin - LastYearMargin, LastYearMargin)

使用 VAR 的好处:

  1. 避免重复计算同一个表达式,提升性能
  2. 让复杂的 DAX 公式更易读
  3. 可以定义多个中间变量

7. 常见分析场景模板

分析场景 推荐 DAX 公式
年累计销售额 TOTALYTD(SUM(销售[销售额]), 日期表[Date])
去年同期销售额 CALCULATE(SUM(销售[销售额]), SAMEPERIODLASTYEAR(日期表[Date]))
同比增长率 DIVIDE([销售额] - [销售额_去年同期], [销售额_去年同期])
月累计 TOTALMTD(SUM(销售[销售额]), 日期表[Date])
季度累计 TOTALQTD(SUM(销售[销售额]), 日期表[Date])
移动平均(7日) AVERAGEX(DATESINPERIOD(...), CALCULATE(SUM(...)))
产品排名 RANKX(ALL(产品), [销售额])

8. 小结

本篇介绍了:

  • ✅ 日期表的创建与标记
  • ✅ TOTALYTD / TOTALQTD / TOTALMTD 时间累计函数
  • ✅ SAMEPERIODLASTYEAR 和 PARALLELPERIOD 同比/环比计算
  • ✅ 同比增长率和环比增长率的 DAX 实现
  • ✅ 移动平均(AVERAGEX + DATESINPERIOD)
  • ✅ RANKX 排名、TOPN 取前N、VAR 变量优化

下一篇:我们将进入可视化环节,学习如何选择合适的图表类型,设计清晰美观的报表,以及 Power BI 可视化的最佳实践。