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,则 return 总大小、总包数和 "mix"。
Prod 1 场景 return Prod1 120g pack of 5 mix(因为 120 = 20x2+25x2+30,而 5 是 2+2+1 包的总数)。
如果回归变量的数量仅为 1(即数字计数为 3 或更少),我想 return 回归变量的(不是总数!)大小和包大小。
IE。 Prod 2 场景:return 名称是 Prod2 200g 一包 2(而不是 ProdName 400 包 2)
我正在构建一组辅助列。现在我只知道如何解决 Prod2 的情况,当有 3 个或更少的数字时。我正在寻找解决方案,但计划是:
- 将每一行的数字放入不包括空白的列表中(这就是我现在的做法)
- 计算 MAX 并检查是否有其他数字相乘 = MAX
- 将较小的数字分配给包装尺寸,将第二大的数字分配给尺寸(忽略 MAX)
我还不确定 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
我有一个由产品名称(来自当地国家的数据库)和列组成的数据集,所有数字都从它们的名称中解析出来。
我正在构建一个数据映射器,它将根据中央数据库中使用的标准重建产品名称。又名 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,则 return 总大小、总包数和 "mix"。 Prod 1 场景 return Prod1 120g pack of 5 mix(因为 120 = 20x2+25x2+30,而 5 是 2+2+1 包的总数)。
如果回归变量的数量仅为 1(即数字计数为 3 或更少),我想 return 回归变量的(不是总数!)大小和包大小。 IE。 Prod 2 场景:return 名称是 Prod2 200g 一包 2(而不是 ProdName 400 包 2)
我正在构建一组辅助列。现在我只知道如何解决 Prod2 的情况,当有 3 个或更少的数字时。我正在寻找解决方案,但计划是:
- 将每一行的数字放入不包括空白的列表中(这就是我现在的做法)
- 计算 MAX 并检查是否有其他数字相乘 = MAX
- 将较小的数字分配给包装尺寸,将第二大的数字分配给尺寸(忽略 MAX)
我还不确定 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