У меня есть динамический массив строк из 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()
. См. изображение.
Примеры данных и желаемые отфильтрованные результаты
Выходы:
Я могу заставить работать два уникальных столбца, но не знаю, как собрать необходимые мне связанные данные.
Это правильно сортирует имя человека и процесс, но очевидно удаляет два других столбца:
=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)
Я пробовал функцию LET()
, а также некоторые SEQUENCE()
, LAMBDA()
и несколько других опций, но, похоже, не могу заставить массивы правильно фильтроваться.
Попробуйте использовать следующую формулу:
=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)
Звучит здорово, приятно услышать ваше мнение и поделиться отзывом, рад помочь 😊 @Muffinman
Если у кого-то еще возникают проблемы с оператором диапазона разлива (#): вместо этого вы можете написать A1:D11
.
Если бы это было отсортировано, это сработало бы:
=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_
)
)
)
)
)
Великолепно! Я попытался сделать что-то похожее на объединение и сравнение, но не подумал использовать для этого XMATCH и INDEX. Спасибо за помощь!