У меня есть следующая таблица, в которой у нас одинаковый идентификатор и дата. Однако я хочу создать массив, который меняет идентификатор на основе идентификатора и даты.
Формула, которую я пробовал:
=IF(AND(DROP(TAKE(A:A,COUNTA(A:A)),1)=12345,
DROP(TAKE(B:B,COUNTA(A:A)),1)<DATE(2024,1,1)),"54321",
DROP(TAKE(A:A,COUNTA(A:A)),1))
но запись 3 не дает правильного ответа
@P.b Сэр, ваша формула не будет работать, если вы измените последний идентификатор на 12346
, он останется таким же 54321
, как и должно быть 12346
, поскольку идентификатор не равен 12345
и, следовательно, здесь требуется AND()
, чтобы уловить все условия !
С данными образцами это не имело бы значения. В остальном ты прав.
Вы можете попробовать использовать следующую формулу:
=IF((A2:A4=12345)*(B2:B4<DATE(2024,1,1)),54321,A2:A4)
Или также можно использовать следующее: предполагается, что столбец ID
является основой для последней строки, вам не нужна вспомогательная функция LAMBDA()
здесь, и вместо использования функции AND()
используйте оператор *
:
=LET(
_LastRow, MATCH(2,1/(A:A<>"")),
_ID, DROP(TAKE(A:A,_LastRow),1),
_Date, DROP(TAKE(B:B,_LastRow),1),
IF((_ID=12345)*(_Date<DATE(2024,1,1)),54321,_ID))
NOTE: Use of *
because in Boolean logical operation the rules states that, multiplication corresponds to AND()
logical function, while addition +
corresponds to OR()
logical function.
Приложение: Если вы хотите использовать конкретно функцию AND()
, вам понадобятся вспомогательные функции LAMBDA()
, такие как MAP()
:
=LET(
_LastRow, MATCH(2,1/(A:A<>"")),
_ID, DROP(TAKE(A:A,_LastRow),1),
_Date, DROP(TAKE(B:B,_LastRow),1),
MAP(_ID,_Date,LAMBDA(α,δ,
IF(AND(α=12345,δ<DATE(2024,1,1)),54321,α))))
Сбросив еще один дубль,
=LAMBDA(data, from_id, to_id, before_date_,
LET(
data, DROP(TAKE(data, COUNTA(TAKE(data, , 1))), 1),
id, INDEX(data, 0, 1),
date_, TAKE(data, , -1),
IF((id = from_id) * (date_ < before_date_), to_id, id)
)
)($A:$B, 12345, "54321", DATE(2024, 1, 1))
Для предоставленного примера данных нет необходимости включать AND:
=LET(L,MATCH(2,1/A:A),IF(B2:INDEX(B:B,L)<45292,54321,A2:INDEX(A:A,L)))
или=LET(x,LAMBDA(y,FILTER(y,IFERROR(--B:B,0))),IF(x(B:B)<45292,54321,x(A:A)))