Использование Excel O365. Как использовать уникальность в двух столбцах, сортировать и копировать связанные данные?

У меня есть динамический массив строк из 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, для поиска уникальных значений, используя только первые два столбца (т. е. собираются GTAW Person 1 и MGTAW Person 1, но более старая дата GTAW Person 1 игнорируется.)

Также нужно, чтобы при выборе уникальных данных была получена самая последняя запись, возможно, предварительная сортировка?

Наконец, я хочу показать все 4 столбца отфильтрованных данных, но не хочу, чтобы номер или дата заказа были частью UNIQUE()FILTER(). См. изображение.

Примеры данных и желаемые отфильтрованные результаты


Имя Процессы Заказ # Дата Человек 1 GTAW 438113 29.10.2022 Человек 1 GTAW 159623 04.09.2020 Человек 1 МГТАВ 478734 13.08.2021 Человек 2 GTAW 968533 22.04.2021 Человек 2 GTAW 864934 06.03.2021 Человек 2 ВППАВ 841763 22.02.2022 Человек 3 GTAW 916397 23.10.2022 Человек 3 GTAW 573528 21.11.2023 Человек 3 МГТАВ 488440 01.09.2022 Человек 3 GTAW 224110 18.06.2021

Выходы:

Имя Процессы Заказ # Дата Человек 1 GTAW 438113 29.10.2022 Человек 1 МГТАВ 478734 13.08.2021 Человек 2 GTAW 968533 22.04.2021 Человек 2 ВППАВ 841763 22.02.2022 Человек 3 GTAW 573528 21.11.2023 Человек 3 МГТАВ 488440 01.09.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)

Имя и процесс отфильтрованы


Имя Процессы Человек 1 GTAW Человек 1 МГТАВ Человек 2 GTAW Человек 2 ВППАВ Человек 3 GTAW Человек 3 МГТАВ

Я пробовал функцию LET(), а также некоторые SEQUENCE(), LAMBDA() и несколько других опций, но, похоже, не могу заставить массивы правильно фильтроваться.

Преобразование HTML-таблицы в профессиональный документ Excel
Преобразование HTML-таблицы в профессиональный документ Excel
Это самый простой способ создания Excel из HTML-таблицы.
Импорт excel в laravel в базу данных
Импорт excel в laravel в базу данных
Здравствуйте, дорогой читатель, в этой статье я расскажу практическим и быстрым способом, как импортировать файл Excel в вашу базу данных с помощью...
2
0
101
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

Попробуйте использовать следующую формулу:


=LET(
     _Data, A2:D11,
     _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)))))

А если вам нужны только первые два столбца, то:


=LET(
     _Data, A2:D11,
     _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(A2:D11,MAP(INDEX(A2:D11,,1),INDEX(A2:D11,,2),
 LAMBDA(α,δ,COUNTIFS(A1:α,α,B1:δ,δ)))=1),,2)

Или без помощника LAMBDA():

=LET(
     _Data, A2:D11,
     _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)

Великолепно! Я попытался сделать что-то похожее на объединение и сравнение, но не подумал использовать для этого XMATCH и INDEX. Спасибо за помощь!

Muffinman 20.07.2024 19:43

Звучит здорово, приятно услышать ваше мнение и поделиться отзывом, рад помочь 😊 @Muffinman

Mayukh Bhattacharya 20.07.2024 19:45

Если у кого-то еще возникают проблемы с оператором диапазона разлива (#): вместо этого вы можете написать A1:D11.

sicreep 20.07.2024 22:56

Если бы это было отсортировано, это сработало бы:

=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 до текущей строки a и 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))))

Итак, сделали это с помощью функции unique():

Вывод соответствует результатам, показанным вами и другими.

МАКСИФЫ

Выберите самую последнюю (MAXIF(date_…), запись по имени и процессу, и если для даты найдено несколько записей, выберите запись с наибольшим номером заказа (MAXIF(order_num,…):

=LET(
    header, A1:D1,
    data, A2:D11,
    name, INDEX(data, , 1),
    process, INDEX(data, , 2),
    order_num, INDEX(data, , 3),
    date_, INDEX(data, , 4),
    VSTACK(
        header,
        FILTER(
            HSTACK(
                name,
                process,
                order_num,
                TEXT(date_, "m/d/yyyy")
            ),
            (
                date_ =
                    MAXIFS(date_, name, name, process, process)
            ) *
                (
                    order_num =
                        MAXIFS(
                            order_num,
                            name, name,
                            process, process,
                            date_, date_
                        )
                )
        )
    )
)

Другие вопросы по теме