代码之家  ›  专栏  ›  技术社区  ›  Muffinman

使用Excel O365,如何在两列上使用唯一性,对相关数据进行排序和复制?

  •  1
  • Muffinman  · 技术社区  · 10 月前

    我有一个 4. 列,包含名称、进程、顺序号和日期的动态行数组。数组是动态的,正在使用 FILTER() 功能和抓取 4. 我想要的列来自另一张表上的表。

    =FILTER(WelderQualifications[[Employee Name]:[Date Performed]],
     {1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,1})
    

    我需要一个 非VBA 仅使用前两列查找唯一值的解决方案(即。 人员1 GTAW 人1 MGTAW 已收集,但年龄较大 人员1 GTAW 日期被忽略。)

    还需要它在选择唯一数据时抓取最新记录,也许是初步排序?

    最后,我想显示所有4列过滤后的数据,但我不希望订单号或日期成为 UNIQUE() 过滤器() 。参见图片。

    Sample data and desired filtered results


    姓名 过程 订购# 日期
    人1 GTAW 438113 10/29/2022
    人1 GTAW 159623 9/4/2020
    人1 MGTAW 478734 8/13/2021
    人2 GTAW 968533 4/22/2021
    人2 GTAW 864934 3/6/2021
    人2 VPPAW 841763 2/22/2022
    人3 GTAW 916397 10/23/2022
    人3 GTAW 573528 11/21/2023
    人3 MGTAW 488440 9/1/2022
    人3 GTAW 224110 6/18/2021

    输出:

    姓名 过程 订购# 日期
    人1 GTAW 438113 10/29/2022
    人1 MGTAW 478734 8/13/2021
    人2 GTAW 968533 4/22/2021
    人2 VPPAW 841763 2/22/2022
    人3 GTAW 573528 11/21/2023
    人3 MGTAW 488440 9/1/2022

    我可以让这两个独特的列工作,但我不确定如何收集我需要的相关数据。

    这会正确地对人员姓名和流程进行排序,但会明显删除其他两列:

    =UNIQUE(SORT(FILTER(WelderQualifications[[Employee Name]:[Date Performed]],
    {1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0}),1,1),FALSE,FALSE)
    

    Name and process filtered


    姓名 过程
    人1 GTAW
    人1 MGTAW
    人2 GTAW
    人2 VPPAW
    人3 GTAW
    人3 MGTAW

    我试过 LET() 功能和一些 SEQUENCE() , LAMBDA() ,以及其他一些选项,但似乎无法使数组正确过滤。

    1 回复  |  直到 10 月前
        1
  •  0
  •   Mayukh Bhattacharya    10 月前

    尝试使用以下公式:

    enter image description here


    =LET(
         _Data, A1#,
         _Headers, TAKE(_Data,1),
         _Body, DROP(_Data,1),
         _Sort, SORT(_Body,{1,2,4},{1,1,-1}),
         _Uniq, UNIQUE(TAKE(_Sort,,2)),
         VSTACK(_Headers,CHOOSEROWS(_Sort,
         XMATCH(INDEX(_Uniq,,1)&"|"&INDEX(_Uniq,,2),
         INDEX(_Sort,,1)&"|"&INDEX(_Sort,,2)))))
    

    如果你只需要前两列,那么:

    enter image description here


    =LET(
         _Data, A1#,
         _Headers, TAKE(_Data,1),
         _Body, DROP(_Data,1),
         _Sort, SORT(_Body,{1,2,4},{1,1,-1}),
         _Uniq, UNIQUE(TAKE(_Sort,,2)),
         VSTACK(TAKE(_Headers,,2),_Uniq))
    

    也可以尝试:

    =FILTER(A2:B11,MAP(A2:A11,B2:B11,LAMBDA(α,δ,COUNTIFS(A2:α,α,B2:δ,δ)))=1)
    

    或者,更具体地说:

    =TAKE(FILTER(A1#,MAP(INDEX(A1#,,1),INDEX(A1#,,2),
     LAMBDA(α,δ,COUNTIFS(A1:α,α,B1:δ,δ)))=1),,2)
    

    或者,没有 LAMBDA() 帮手:

    =LET(
         _Data, A1#,
         _Body, SORT(DROP(_Data,1),{1,2,4},{1,1,-1}),
         CHOOSECOLS(VSTACK(TAKE(_Data,1),
         UNIQUE(CHOOSEROWS(_Body,XMATCH(INDEX(_Body,,1)&"|"&INDEX(_Body,,2),
         INDEX(_Body,,1)&"|"&INDEX(_Body,,2))))),{1,2}))
    

    如果适用,则可以使用 GROUPBY() 目前可用 MS365 Office Insiders

    =LET(α,SORT(A2:D11,{1,2,4},{1,1,-1}),GROUPBY(TAKE(α,,2),TAKE(α,,-2),SINGLE,,0))
    

    或者,

    =GROUPBY(SORTBY(A2:B11,D2:D11,-1),SORT(C2:D11,2,-1),SINGLE,,0)
    

        2
  •  0
  •   P.b    10 月前

    如果进行排序,这将奏效:

    =FILTER(A2:D11,MAP(A2:A11,B2:B11,LAMBDA(a,b,SUM((A2:a=a)*(B2:b=b))=1)))

    MAP 在范围内循环 A2:A11 作为 a 范围也是如此 B2:B11 作为 b 如果 A2 截至当前行 B2 截至当前行 b 如果为1(2的组合的第一次出现),则返回TRUE,否则返回FALSE。这用于过滤行的范围 A2:D11

    否则,您不能使用范围引用,但可以使用序列来刺激它:

    =LET(s,SORT(A2:D11,4,-1),FILTER(s,MAP(SEQUENCE(ROWS(s)),LAMBDA(m,SUM((INDEX(s,SEQUENCE(m),1)=INDEX(s,m,1))*(INDEX(s,SEQUENCE(m),2)=INDEX(s,m,2)))=1))))

        3
  •  0
  •   Solar Mike    10 月前

    所以,使用unique()函数做到了这一点:

    enter image description here

    输出与您和其他人显示的结果相匹配。