M Power Query - 通过将值与两个参考列进行比较,有条件地转换动态列数中的值

Posted

技术标签:

【中文标题】M Power Query - 通过将值与两个参考列进行比较,有条件地转换动态列数中的值【英文标题】:M Power Query - conditionally convert values from a dynamic number of columns by comparing values against two reference columns 【发布时间】:2021-10-27 09:49:09 【问题描述】:

我遇到了一个我自己无法解决的难题。

数据集中有许多动态创建的列。他们的数量可以变化(从几十到一百多个)。它们以以下日期格式保存数据:01.10.2021(日/月/年)。在下面的示例中,这些列称为 Date1、Date2、Date3。

还有两个参考列,也包含日期 - 开始日期和结束日期(用于订阅)。 我想有条件地将日期值从日期转换为 0-1 格式,具体取决于单元格中的条件是否符合参考日期。

我想检查每个日期列,单元格中的日期是否在订阅的开始日期和结束日期之间,或者如果没有结束日期,则在开始日期之后(换句话说,订阅是否在特定的一天是否活跃)。如果订阅处于活动状态,我想返回 1,如果在特定日期不活动,我想返回 0。

转换前的示例表:

Start Date End Date Date1 Date2 Date3
01.01.2020 01.05.2021 01.03.2020 01.04.2021 01.09.2021
01.05.2020 01.08.2021 01.03.2020 01.04.2021 01.09.2021
01.02.2021 null 01.03.2020 01.04.2021 01.09.2021

转换后的期望结果:

Start Date End Date Date1 Date2 Date3
01.01.2020 01.05.2021 1 1 0
01.05.2020 01.08.2021 0 1 0
01.02.2021 null 0 1 1

我尝试了多种解决方案,但我的语法一定有错误,因为我收到一个表达式错误:“我们无法将字段访问应用于类型日期”。

我尝试的最后一个解决方案是:

Transformation = Table.TransformColumns(#"Previous step", List.Transform(FunctionToReturnListOfColumnNames(), each _, each if [Start Date] <= _ and ([End Date] = null or [End Date] > _) then 1 else 0, type number))

返回列名列表的函数正常工作,错误在条件表达式的某个地方。

我尝试使用 Number.From() 函数首先将所有日期列转换为整数,假设应用于日期的逻辑运算符可能存在问题,但即使所有列都转换为数字,问题仍然存在,错误是一样的,只针对类型号:"We cannot apply field access to the type number"

如果您能指出我语法中的错误,我将不胜感激。

【问题讨论】:

【参考方案1】:

Unpivot ...比较...repivot

所有步骤:

单击选择前两列,右键单击,取消透视其他列

使用公式添加自定义列

 if [Start Date] <= [Value] and ([End Date] = null or [End Date] > [Value]) then 1 else 0

右键单击并删除值列

点击选择属性列

转换 ... 透视列 ... 值列 = 自定义

如果需要将开始日期和结束日期列的格式更改为日期

let Source = Excel.CurrentWorkbook()[Name="Table1"][Content],
#"Unpivoted Other Columns" = Table.UnpivotOtherColumns(Source, "Start Date", "End Date", "Attribute", "Value"),
#"Added Custom" = Table.AddColumn(#"Unpivoted Other Columns", "Custom", each if [Start Date] <= [Value] and ([End Date] = null or [End Date] > [Value]) then 1 else 0),
#"Removed Columns" = Table.RemoveColumns(#"Added Custom","Value"),
#"Pivoted Column" = Table.Pivot(#"Removed Columns", List.Distinct(#"Removed Columns"[Attribute]), "Attribute", "Custom", List.Sum)
in #"Pivoted Column"

【讨论】:

以上是关于M Power Query - 通过将值与两个参考列进行比较,有条件地转换动态列数中的值的主要内容,如果未能解决你的问题,请参考以下文章

Power Query Excel 将值显示为列的百分比

power query中M函数和处理数据

Power Query和Power BI M函数中的环境和each _

Dax vs M(power query)表组合大表的最佳实践

M语言的写改删(Power Query 之 M 语言)

在 Power Bi 中使用 Power Query M 的上一周日期