Power BI 系列 - M语言 -1 高级过滤数据
Power BIower BI导入模型中用户通过"编辑查询" 可以指定数据库连接及加载 数据导入.
举例来说,有一张电子表格 有各每一天的历史记录, 用户同时需要查看每一天的表格,以及当月最后一天的数据.
黄色部就是每月后一天的,
解决方案: 可以编辑查询处理.也可以通DAX处理. 重点说一下M语言
步聚如下:
1.打开POWER BI打开数据设计
2.编辑,进入PowerQuery 即查询编辑器,点编辑,我们一起看查询编辑 怎么样
数据导入进来,通过高级编辑器,看下一下如何加载数据的
红色 框框就是M语言的语法. 除了最后一个步聚不要后面要加 ","
let
步聚名1=xxxxxx ,
步聚名1=xxxx
in
步聚名1
下面这段的话的意思就是 源 ( 是个变量) = 来自电子表格 , 取itme =sheet1 工作薄, 第一行作为标题, 并且更改数据类型,并简单过滤为空的
let 源 = Excel.Workbook(File.Contents("D:\Demo\PowerBI\4-1M语言.xlsx"), null, true), Sheet1_Sheet = 源{[Item="Sheet1",Kind="Sheet"]}[Data], 提升的标题 = Table.PromoteHeaders(Sheet1_Sheet, [PromoteAllScalars=true]), 更改的类型 = Table.TransformColumnTypes(提升的标题,{{"日期", type date}, {"物料", type text}, {"库存地", type text}, {"数量", Int64.Type}}), 筛选的行 = Table.SelectRows(更改的类型, each ([日期] <> null)) in 筛选的行
每个步聚名和右边应用步聚是一样. (Power BIower BI可以保存加载记录, 说白了,就是把每一步操作记录下来. 每一步的源,能传递下来. 当然有些步聚可以暂时保存下来,相当于临时表, 下一步可能使前几天步的源也可以
这时候还需要每个月最后一天数据, 有人会想到用group by 每一行进行分组,对度量值求最大值. 但是这不是很好的方法,因为字段太多就要区分哪些可以分组,哪些是度量值.
一种开销少的方案如下
开始
1.新建一个空白查询
2选择高级编辑器 查询如下, 其含义引用 sheet 的数据集到源 . 直接就复用数据源
let 源 = Sheet1 in 源
3.派生一列月份
let 源 = Sheet1, 复制的列 = Table.AddColumn(源,"月", each Date.ToText([日期],"yyyy-MM")) in 复制的列
4.按月份分组
let 源 = Sheet1, 复制的列 = Table.AddColumn(源,"月", each Date.ToText([日期],"yyyy-MM")) , 分组的行 = Table.Group(复制的列, {"月"}, {{"月最后一天", each List.Max([日期]), type date}}) in
分组的行
4.按月份分组 Table.NetstedJoin 的含义 .
Inner join关联 ( 表名A, 表 A关联字段, 表B,表B关联的字段, 表B的别名, 关联类型内联接)
let 源 = Sheet1, 复制的列 = Table.AddColumn(源,"月", each Date.ToText([日期],"yyyy-MM")) , 分组的行 = Table.Group(复制的列, "月", {{"月最后一天", each List.Max([日期]), type date}}), 合并的查询 = Table.NestedJoin(源 , {"日期"}, 分组的行, {"月最后一天"}, "随便取个名", JoinKind.Inner) in 合并的查询
5. 不需要表B的字段
let 源 = Sheet1, 复制的列 = Table.AddColumn(源,"月", each Date.ToText([日期],"yyyy-MM")) , 分组的行 = Table.Group(复制的列, "月", {{"月最后一天", each List.Max([日期]), type date}}), 合并的查询 = Table.NestedJoin(源 , {"日期"}, 分组的行, {"月最后一天"}, "随便取个名", JoinKind.Inner), 删除的列 = Table.RemoveColumns(合并的查询,{"随便取个名"}) in 删除的列
最后结果