Power Query检查是否有任何数字是剩余数字子集的线性组合

Power Query check if any number is a linear combination of a subset of remaining numbers

我有一个由产品名称(来自当地国家的数据库)和列组成的数据集,所有数字都从它们的名称中解析出来。

我正在构建一个数据映射器,它将根据中央数据库中使用的标准重建产品名称。又名 ProdName 尺寸 PackSize [混合可选]

产品尺寸 = SUM ( Size(i) x NumPacks(i) ), i=[1,10]

数据示例(列数可以是 1-10 之间的任何值):

ProdName|num1| num 2 |num 3 |num 4|num 5 | num 6 | num 7 | Desired Output
Prod1   | 5  | 20    | 2    | 25  | 2    | 30    | 120   | Prod1 120g pack of 5 (mix)
Prod2   | 2  | 200   |      | 400 |      |       |       | Prod2 200g pack of 2

挑战在于一些数字将是不相关的,即条形码痕迹、折扣、品牌名称的一部分。

我需要找到一种方法来识别

  1. 是否有任何数字是其他数字子集的线性组合。
  2. 如果是,并且回归变量的数量大于 1,则 return 总大小、总包数和 "mix"。 Prod 1 场景 return Prod1 120g pack of 5 mix(因为 120 = 20x2+25x2+30,而 5 是 2+2+1 包的总数)。

  3. 如果回归变量的数量仅为 1(即数字计数为 3 或更少),我想 return 回归变量的(不是总数!)大小和包大小。 IE。 Prod 2 场景:return 名称是 Prod2 200g 一包 2(而不是 ProdName 400 包 2)

我正在构建一组辅助列。现在我只知道如何解决 Prod2 的情况,当有 3 个或更少的数字时。我正在寻找解决方案,但计划是:

我还不确定 Prod1 的复杂情况。

一个好的答案,应该知道所有类型的可能组合。 对于提供的 2 个示例,这将起作用:

let
    Source = Excel.CurrentWorkbook(){[Name="Data"]}[Content],
    #"Added Custom" = Table.AddColumn(Source, "NonNullCount", each List.NonNullCount(Record.FieldValues(_))),
    #"Added Conditional Column" = Table.AddColumn(#"Added Custom", "Output", each if [NonNullCount] = 4 then [ProdName] & " " & Text.From([num2]) & "g pack of "&Text.From([num1]) else [ProdName] & " "& Text.From(List.Max(List.Skip(Record.FieldValues(_),1))) & "g pack of "&Text.From([num1]) & " (mix)")
in
    #"Added Conditional Column"

这是另外两个想法。 获取值列表、添加最大值和最小值、快速分析列表中的值(您可以在此处添加您的逻辑):

let
    Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
    AddValuesList = Table.AddColumn(Source, "ValList", (x)=>
                       List.SelectValues(Record.ToList(Record.RemoveFields(x, "ProdName")), 
                          (y)=> y <> null)),
    AddMax = Table.AddColumn(AddValuesList, "MaxVal", each List.Max([ValList])),
    AddMin = Table.AddColumn(AddMax, "MinVal", each List.Min([ValList])), 
    AddCnt = Table.AddColumn(AddMin, "ItemCount", 
              if List.Contains(List.Select([ValList], (x)=> x <> [MaxVal] and x <> [MinVal]) 
                               , [MaxVal]/[MinVal]) 
              then [MaxVal]/[MinVal] 
              else null)

in
     AddCnt