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

推荐订阅源

T
Threat Research - Cisco Blogs
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
The Register - Security
The Register - Security
A
About on SuperTechFans
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
L
LangChain Blog
N
Netflix TechBlog - Medium
量子位
博客园 - 三生石上(FineUI控件)
宝玉的分享
宝玉的分享
H
Help Net Security
D
Docker
D
DataBreaches.Net
T
Tailwind CSS Blog
阮一峰的网络日志
阮一峰的网络日志
B
Blog
博客园 - 聂微东
Apple Machine Learning Research
Apple Machine Learning Research
Google DeepMind News
Google DeepMind News
The Cloudflare Blog
F
Full Disclosure
GbyAI
GbyAI
F
Fortinet All Blogs
Last Week in AI
Last Week in AI
Y
Y Combinator Blog
人人都是产品经理
人人都是产品经理
Recent Announcements
Recent Announcements
博客园 - Franky
MongoDB | Blog
MongoDB | Blog
有赞技术团队
有赞技术团队
博客园 - 叶小钗
小众软件
小众软件
V
Visual Studio Blog
月光博客
月光博客
Stack Overflow Blog
Stack Overflow Blog
The GitHub Blog
The GitHub Blog
Recorded Future
Recorded Future
J
Java Code Geeks
雷峰网
雷峰网
P
Privacy & Cybersecurity Law Blog
C
Cisco Blogs
C
Cyber Attacks, Cyber Crime and Cyber Security
AWS News Blog
AWS News Blog
Webroot Blog
Webroot Blog
美团技术团队
N
News | PayPal Newsroom
G
Google Developers Blog
Security Archives - TechRepublic
Security Archives - TechRepublic
博客园_首页
V
Vulnerabilities – Threatpost

博客园 - 哥本哈士奇(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学习笔记第12篇:DAX 高级计算与性能优化 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学习笔记第14篇:Power Query 高级数据处理
哥本哈士奇(aspnet · 2026-04-25 · via 博客园 - 哥本哈士奇(aspnetx)

第14篇:Power Query 高级数据处理

1. Power Query 核心概念

1.1 M 语言基础

Power Query 使用 M 语言进行数据转换:

// 基本语法结构
let
    步骤1 = 操作1,
    步骤2 = 操作2,
    结果 = 最终输出
in
    结果

1.2 查询步骤链

源数据
   ↓ 引用类型转换
   ↓ 删除列
   ↓ 筛选行
   ↓ 分组聚合
   ↓ 合并查询
   ↓ 输出结果

2. 高级数据获取

2.1 多文件合并

场景: 合并文件夹中的多个 Excel 文件

let
    源 = Folder.Files("C:\Data\Sales"),
    筛选Excel = Table.SelectRows(源, each [Extension] = ".xlsx"),
    添加内容 = Table.AddColumn(筛选Excel, "Content", each Excel.Workbook([Content])),
    展开内容 = Table.ExpandTableColumn(添加内容, "Content", {"Data", "Item"}),
    展开数据 = Table.ExpandTableColumn(展开内容, "Data", {"日期", "产品", "金额"})
in
    展开数据

2.2 动态数据源

使用参数化数据源:

let
    服务器名 = Parameter 服务器名称,
    数据库名 = Parameter 数据库名称,
    连接字 = "Provider=SQLNCLI11;Server=" & 服务器名 & ";Database=" & 数据库名,
    数据 = Sql.Database(服务器名, 数据库名)
in
    数据

2.3 Web API 调用

let
    URL = "https://api.example.com/data",
    请求头 = [#"Authorization" = "Bearer your-token"],
    响应 = Json.Document(Web.Contents(URL, [Headers = 请求头])),
    转表 = Table.FromRecords(响应[data])
in
    转表

3. 复杂数据清洗

3.1 文本处理

// 提取数字
提取金额 = Table.AddColumn(源, "金额", each Number.From(Text.Select([描述], {"0".."9", "."})))

// 分割列
分割姓名 = Table.SplitColumn(源, "姓名", Splitter.SplitTextByDelimiter(" "), {"姓", "名"})

// 正则替换(需调用 Python)
// 建议在 Power Query 中用基础函数替代
清理文本 = Table.TransformColumns(源, {"字段", each Text.Clean(Text.Trim(_))})

3.2 日期处理

// 从文本解析日期
解析日期 = Table.TransformColumns(源, {"日期列", each Date.FromText(_, "zh-CN"))

// 提取日期部分
添加年月 = Table.AddColumn(源, "年月", each Date.ToText([日期], "yyyy-MM"))

// 计算工作日
工作日判断 = Table.AddColumn(源, "是否工作日", each List.Contains({1..5}, Date.DayOfWeek([日期], Day.Monday) + 1))

3.3 数据类型推断

// 批量类型转换
类型转换 = Table.TransformColumnTypes(
    源,
    {
        {"日期", type date},
        {"金额", type number},
        {"数量", Int64.Type}
    },
    "zh-CN"
)

4. 高级合并与连接

4.1 多表合并

let
    表1 = Excel.Workbook(File.Contents("销售.xlsx")){[Item="销售"]}[Data],
    表2 = Excel.Workbook(File.Contents("订单.xlsx")){[Item="订单"]}[Data],
    合并表 = Table.Combine({表1, 表2})
in
    合并表

4.2 条件合并

// 左反连接(仅左表独有)
左反 = Table.NestedJoin(
    表1, {"ID"},
    表2, {"ID"},
    "合并",
    JoinKind.LeftAnti
)

// 完全外连接
全外 = Table.NestedJoin(
    表1, {"ID"},
    表2, {"ID"},
    "合并",
    JoinKind.FullOuter
)

4.3 模糊匹配

模糊匹配 = Table.FuzzyNestedJoin(
    表1, {"姓名"},
    表2, {"姓名"},
    "匹配结果",
    JoinKind.LeftJoin,
    [IgnoreCase=true, IgnoreSpace=true]
)

5. 数据透视与逆透视

5.1 透视列

将行值转为列:

透视结果 = Table.Pivot(
    源,
    List.Distinct(源[月份]),
    "月份",
    "销售额",
    List.Sum
)

转换前:

产品 月份 销售额
A 1月 100
A 2月 150
B 1月 200

转换后:

产品 1月 2月
A 100 150
B 200 null

5.2 逆透视列

将列转为行值:

逆透视 = Table.Unpivot(
    源,
    {"1月", "2月", "3月"},
    "月份",
    "销售额"
)

6. 自定义函数

6.1 创建函数

// 函数:计算税后价格
税后价格 = (价格 as number, 税率 as number) as number =>
    let
        结果 = 价格 * (1 + 税率)
    in
        结果

// 使用函数
添加税后 = Table.AddColumn(源, "税后价", each 税后价格([单价], 0.13))

6.2 递归函数

// 计算阶乘
阶乘 = (n as number) as number =>
    if n <= 1 then 1
    else n * @阶乘(n - 1)

6.3 参数化函数

// 动态数据获取
获取数据 = (服务器 as text, 数据库 as text, 表名 as text) =>
    let
        结果 = Sql.Database(服务器, 数据库){[Schema="dbo", Item=表名]}[Data]
    in
        结果

7. 高级分组聚合

7.1 多级分组

多级分组 = Table.Group(
    源,
    {"地区", "产品类别"},
    {
        {"销售总额", each List.Sum([销售额])},
        {"订单数量", each Table.RowCount(_)},
        {"平均单价", each List.Average([单价])}
    }
)

7.2 条件分组

条件分组 = Table.Group(
    源,
    {"客户"},
    {
        {"大订单数", each Table.RowCount(Table.SelectRows(_, (r) => r[金额] > 10000))},
        {"小额订单总额", each List.Sum(List.Select([金额], (x) => x <= 1000))}
    }
)

8. 错误处理

8.1 Try-Catch

安全转换 = Table.TransformColumns(
    源,
    {"金额", each try Number.From(_) otherwise null}
)

8.2 错误替换

替换错误 = Table.ReplaceErrorValues(
    源,
    {{"金额", 0}, {"日期", null}}
)

8.3 验证逻辑

验证数据 = Table.AddColumn(
    源,
    "验证状态",
    each
        let
            金额检查 = if [金额] >= 0 then "✓" else "✗",
            日期检查 = if [日期] <= Date.From(DateTime.LocalNow()) then "✓" else "✗"
        in
            if 金额检查 = "✓" and 日期检查 = "✓" then "有效" else "无效"
)

9. 性能优化

9.1 查询折叠

确保操作可推送至数据源:

支持折叠的操作:
✅ 筛选行
✅ 选择列
✅ 排序
✅ 分组聚合
✅ 合并(同源)

不支持折叠:
❌ 条件列(复杂逻辑)
❌ 自定义函数
❌ 多数据源合并

9.2 禁用加载

查询设置 → 禁用:
✅ 仅作为数据源,不加载到模型

9.3 增量刷新

配置步骤:
1. 设置日期参数
2. 筛选最近数据
3. 发布到服务
4. 配置增量刷新策略

10. 最佳实践总结

✅ 使用参数化数据源
✅ 批量处理而非逐行
✅ 尽早筛选减少数据量
✅ 保持查询折叠
✅ 使用函数复用逻辑
✅ 添加描述性步骤名
✅ 处理错误和空值

❌ 避免过度转换
❌ 避免复杂计算列
❌ 避免禁用折叠的操作
❌ 避免引用完整表格
❌ 避免硬编码值

11. 小结

本篇介绍了 Power Query 高级技术:

主题 要点
数据获取 多文件合并、动态源、API
数据清洗 文本处理、日期解析、类型转换
合并连接 多表合并、模糊匹配
透视逆透视 列转行、行转列
自定义函数 参数化、递归、复用
错误处理 Try-Catch、验证逻辑
性能优化 查询折叠、增量刷新

下一篇,我们将探讨企业级报表开发与最佳实践。