Sorting powerqeury,使用另一列中具有分组值的父列对分组行进行排序
我不确定如何处理这个复杂的问题,我需要按组键对表进行排序,但每个组都有一个父行,该父行由另一列中的组键标识 所以这个例子, sku 父母 200 无效的 200-1 200 200-2 200 103 无效的 xxx 103 yyy1 103 yyyy3 103 400 无效的 600 无效的 601 600 602 600 405 400Sorting powerqeury,使用另一列中具有分组值的父列对分组行进行排序,sorting,powerquery,Sorting,Powerquery,我不确定如何处理这个复杂的问题,我需要按组键对表进行排序,但每个组都有一个父行,该父行由另一列中的组键标识 所以这个例子, sku 父母 200 无效的 200-1 200 200-2 200 103 无效的 xxx 103 yyy1 103 yyyy3 103 400 无效的 600 无效的 601 600 602 600 405 400 一种方法可能是使用Table.Sort,并为comparisoncreteria参数提供自定义函数,该参数按如下方式对行进行排序: 主要按SKU(在比较期间
一种方法可能是使用
Table.Sort
,并为comparisoncreteria
参数提供自定义函数,该参数按如下方式对行进行排序:
parentsku
列是否为null
sku
列let
initialTable = Table.FromRows({
{"200", null},
{"200-1", "200"},
{"200-2", "200"},
{"103", null},
{"xxx", "103"},
{"yyy1", "103"},
{"yyy3", "103"},
{"400", null},
{"600", null},
{"601", "600"},
{"602", "600"},
{"405", "400"}
}, type table [sku = text, parentsku = text]),
// Custom sorting behaviour to sort by SKU. If SKUs are equal (for two rows), preference should be given to rows containing a null parent SKU.
sorted = Table.Sort(initialTable, (x as record, y as record) =>
let
xSku = if null <> x[parentsku] then x[parentsku] else x[sku],
ySku = if null <> y[parentsku] then y[parentsku] else y[sku],
skusComparison = Value.Compare(xSku, ySku),
skusAreNotEqual = 0 <> skusComparison,
parentComparison = if null = x[parentsku] then -1 else if null = y[parentsku] then 1 else Value.Compare(x[sku], y[sku]),
sorted = if skusAreNotEqual then skusComparison else parentComparison
in sorted
)
in
sorted
let
initialTable=Table.FromRows({
{“200”,空},
{"200-1", "200"},
{"200-2", "200"},
{“103”,空},
{“xxx”,“103”},
{“yyy1”,“103”},
{“yyyy3”,“103”},
{“400”,空},
{“600”,空},
{"601", "600"},
{"602", "600"},
{"405", "400"}
},类型表[sku=text,parentsku=text]),
//按SKU排序的自定义排序行为。如果SKU相等(对于两行),则应优先考虑包含空父SKU的行。
排序=表。排序(initialTable,(x作为记录,y作为记录)=>
让
xSku=如果为空x[parentsku],则x[parentsku]否则x[sku],
ySku=如果y[parentsku]为空,则y[parentsku]否则y[sku],
skusComparison=Value.Compare(xSku,ySku),
skusAreNotEqual=0 skusComparison,
parentComparison=如果null=x[parentsku],则-1 else如果null=y[parentsku],则为1 else值。比较(x[sku],y[sku]),
排序=如果skusAreNotEqual,则skusComparison else parentComparison
分类
)
在里面
分类
并生成如下表:
我相信这与您的预期输出相匹配。一种方法可能是使用
Table.Sort
并为comparisoncreteria
参数提供自定义函数,该参数按如下方式对行进行排序:
parentsku
列是否为null
sku
列let
initialTable = Table.FromRows({
{"200", null},
{"200-1", "200"},
{"200-2", "200"},
{"103", null},
{"xxx", "103"},
{"yyy1", "103"},
{"yyy3", "103"},
{"400", null},
{"600", null},
{"601", "600"},
{"602", "600"},
{"405", "400"}
}, type table [sku = text, parentsku = text]),
// Custom sorting behaviour to sort by SKU. If SKUs are equal (for two rows), preference should be given to rows containing a null parent SKU.
sorted = Table.Sort(initialTable, (x as record, y as record) =>
let
xSku = if null <> x[parentsku] then x[parentsku] else x[sku],
ySku = if null <> y[parentsku] then y[parentsku] else y[sku],
skusComparison = Value.Compare(xSku, ySku),
skusAreNotEqual = 0 <> skusComparison,
parentComparison = if null = x[parentsku] then -1 else if null = y[parentsku] then 1 else Value.Compare(x[sku], y[sku]),
sorted = if skusAreNotEqual then skusComparison else parentComparison
in sorted
)
in
sorted
let
initialTable=Table.FromRows({
{“200”,空},
{"200-1", "200"},
{"200-2", "200"},
{“103”,空},
{“xxx”,“103”},
{“yyy1”,“103”},
{“yyyy3”,“103”},
{“400”,空},
{“600”,空},
{"601", "600"},
{"602", "600"},
{"405", "400"}
},类型表[sku=text,parentsku=text]),
//按SKU排序的自定义排序行为。如果SKU相等(对于两行),则应优先考虑包含空父SKU的行。
排序=表。排序(initialTable,(x作为记录,y作为记录)=>
让
xSku=如果为空x[parentsku],则x[parentsku]否则x[sku],
ySku=如果y[parentsku]为空,则y[parentsku]否则y[sku],
skusComparison=Value.Compare(xSku,ySku),
skusAreNotEqual=0 skusComparison,
parentComparison=如果null=x[parentsku],则-1 else如果null=y[parentsku],则为1 else值。比较(x[sku],y[sku]),
排序=如果skusAreNotEqual,则skusComparison else parentComparison
分类
)
在里面
分类
并生成如下表:
我相信这符合您的预期输出。另一种方式:
let
Source = Excel.CurrentWorkbook(){[Name="Data"]}[Content],
add = Table.AddColumn(Source, "temp", each if [parentsku] = null then [sku] else [parentsku]),
sort = Table.Sort(add,List.Transform({"temp", "parentsku"}, each {_, 0})),
del = Table.RemoveColumns(sort,{"temp"})
in
del
另一种方式:
let
Source = Excel.CurrentWorkbook(){[Name="Data"]}[Content],
add = Table.AddColumn(Source, "temp", each if [parentsku] = null then [sku] else [parentsku]),
sort = Table.Sort(add,List.Transform({"temp", "parentsku"}, each {_, 0})),
del = Table.RemoveColumns(sort,{"temp"})
in
del
这看起来很有希望,我正在努力了解它是如何工作的。。。。所以我看到x和y记录是两个函数参数。。。。但是,是什么让它们充满了记录呢?您是如何知道table.sort函数将提供它们的?这在任何地方都有记录吗?@J.M.Becker,排序函数的
comparisoncreteria
参数可以采用各种形式,其中一种形式是函数(如此处使用的)。要查看有关comparisonCriteria
的详细信息,请参阅。该链接用于List.Sort
,但是Table.Sort
的信息也适用。我相信表格可以被认为是一个记录列表(尽管这是一个简化),因此为什么x
和y
属于record
类型。这看起来很有希望,我正在尝试了解它是如何工作的。。。。所以我看到x和y记录是两个函数参数。。。。但是,是什么让它们充满了记录呢?您是如何知道table.sort函数将提供它们的?这在任何地方都有记录吗?@J.M.Becker,排序函数的comparisoncreteria
参数可以采用各种形式,其中一种形式是函数(如此处使用的)。要查看有关comparisonCriteria
的详细信息,请参阅。该链接用于List.Sort
,但是Table.Sort
的信息也适用。我相信表格可以被认为是记录列表(尽管这是一种简化),因此为什么x
和y
属于record
类型。