Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/hadoop/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sorting powerqeury,使用另一列中具有分组值的父列对分组行进行排序_Sorting_Powerquery - Fatal编程技术网

Sorting powerqeury,使用另一列中具有分组值的父列对分组行进行排序

Sorting 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(在比较期间

我不确定如何处理这个复杂的问题,我需要按组键对表进行排序,但每个组都有一个父行,该父行由另一列中的组键标识

所以这个例子,

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(在比较期间动态确定)
  • 其次,根据
    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
    参数提供自定义函数,该参数按如下方式对行进行排序:

  • 主要按SKU(在比较期间动态确定)
  • 其次,根据
    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
    类型。