如何将需求与供应匹配逻辑的伪代码转换为M语言?
如何将需求与供应匹配逻辑的伪代码转换为M语言?
看起来你是想在Power Query里给Need表添加自定义列,根据Supply表的条件匹配对应的供应日期对吧?我来帮你梳理逻辑并写出正确的M语言代码。
首先先明确你的需求逻辑,再把它转换成Power Query能识别的写法:
- 优先匹配供应数量≥需求数量、供应日期不为空、供应日期和需求日期相差不超过31天的Supply记录,找到的话就返回对应的供应日期
- 如果没有符合第一条的记录,检查是否存在供应日期为空的Supply记录,有的话返回"NO"
- 其他情况返回"NON2"
接下来是具体的M代码实现,假设你的Need表叫Need,Supply表叫Supply:
let // 取原始的Need表作为数据源 Source = Need, // 添加自定义列,命名为"匹配的供应日期"(可自行修改列名) AddMatchedSupplyDate = Table.AddColumn(Source, "匹配的供应日期", each let // 第一步:筛选符合数量和日期条件的有效供应记录 ValidSupplyRows = Table.SelectRows(Supply, each [Qty] >= [@Qty] // 供应数量≥当前需求的数量 and [Supply date] <> null // 供应日期不为空 // 计算两个日期的天数差绝对值,确保小于31天 and Duration.Days(Number.Abs(Date.From([Supply date]) - Date.From([@Date]))) < 31 ), // 检查是否存在有效供应记录 HasValidSupply = not Table.IsEmpty(ValidSupplyRows), // 检查是否存在供应日期为空的记录 HasNullSupplyDate = not Table.IsEmpty(Table.SelectRows(Supply, each [Supply date] = null)) in // 按照你的逻辑分支返回结果 if HasValidSupply then Table.First(ValidSupplyRows)[Supply date] else if HasNullSupplyDate then "NO" else "NON2" ) in AddMatchedSupplyDate
代码关键点说明:
[@Qty]和[@Date]是Power Query里引用当前行对应列值的写法,这样才能针对Need表的每一行去匹配Supply表的记录Duration.Days(Number.Abs(...))用来精准计算两个日期之间的天数差绝对值,确保满足"小于31天"的条件- 如果有多个符合条件的Supply记录,这里用
Table.First取第一个;若需要取最近的日期,可以给ValidSupplyRows加一行排序逻辑:SortedValidSupply = Table.Sort(ValidSupplyRows, {{"Supply date", Order.Ascending}}),再用Table.First(SortedValidSupply)[Supply date]获取结果
如果你的表名或者列名和示例不一样,记得替换成你实际的名称哦。
备注:内容来源于stack exchange,提问作者Steph
相关产品推荐
相关产品推荐

