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

时间:2017-03-12 13:50:47

标签: powerquery

我有一个由prod名称组成的数据集(来自本地国家'数据库)和列,所有数字都是从他们的名字中解析出来的。

我正在构建一个数据映射器,它将产品名称重建为中央数据库中使用的标准。 Aka ProdName Size PackSize [mix optional]

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

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

NULL

挑战在于一些数字将无关紧要,即条形码,折扣,品牌名称的部分痕迹。

我需要找到一种识别方法

  1. 是否有任何数字是其他数字的线性组合。
  2. 如果是这样,并且回归数量超过1,则返回总大小,包的总数和"混合"。 Prod 1场景将返回 Prod1 120g包装5混合(因为120 = 20x2 + 25x2 + 30,5和5是包2 + 2 + 1的总数)。

  3. 如果回归量的数量仅为1(即数字3或更少),我想返回回归量(不是总数!)大小和packize。 即产品2方案:返回名称是 Prod2 200g包2 (而不是ProdName 400包2)

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

    • 将每行的数字放入不包括空格的列表中(这就是我现在所知道的)
    • 对MAX进行计算并检查其他数字是否相乘= MAX
    • 将较小的num分配给pack size,将第二个较大的num分配给Size(并忽略MAX)

    还不确定Prod1的复杂案例。

    我想知道你们中是否有人知道一个巧妙的伎俩?

    提前致谢!

2 个答案:

答案 0 :(得分:1)

为了得到一个好的答案,人们应该知道所有类型的可能组合。 对于提供的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"

答案 1 :(得分:1)

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

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