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和Power BI M函数中的环境和each _