Как использовать логические операторы с динамическими массивами?

У меня есть следующая таблица, в которой у нас одинаковый идентификатор и дата. Однако я хочу создать массив, который меняет идентификатор на основе идентификатора и даты.

Формула, которую я пробовал:

=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 не дает правильного ответа

Для предоставленного примера данных нет необходимости включать AND: =LET(L,MATCH(2,1/A:A),IF(B2:INDEX(B:B,L)<45292,54321,A2:INDE‌​X(A:A,L))) или =LET(x,LAMBDA(y,FILTER(y,IFERROR(--B:B,0))),IF(x(B:B)<45292,‌​54321,x(A:A)))

P.b 09.07.2024 15:48

@P.b Сэр, ваша формула не будет работать, если вы измените последний идентификатор на 12346, он останется таким же 54321, как и должно быть 12346, поскольку идентификатор не равен 12345 и, следовательно, здесь требуется AND(), чтобы уловить все условия !

Mayukh Bhattacharya 09.07.2024 16:01

С данными образцами это не имело бы значения. В остальном ты прав.

P.b 09.07.2024 16:52
Преобразование HTML-таблицы в профессиональный документ Excel
Преобразование HTML-таблицы в профессиональный документ Excel
Это самый простой способ создания Excel из HTML-таблицы.
Импорт excel в laravel в базу данных
Импорт excel в laravel в базу данных
Здравствуйте, дорогой читатель, в этой статье я расскажу практическим и быстрым способом, как импортировать файл Excel в вашу базу данных с помощью...
1
3
57
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

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


=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))

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