(Відповідаючи тут, як немає окремого запитання щодо відсортованих даних.)
Якщо дані були відсортовані, можна використовувати VLOOKUPз range_lookupаргументом TRUE(або опущено, так як це за замовчуванням), який офіційно описаний для Excel , як «пошук приблизного матчу».
Іншими словами, для відсортованих даних:
- встановлення останнього аргументу для
FALSEповернення першого значення та
- встановлення останнього аргументу для
TRUEповернення останнього значення.
Це значною мірою незадокументоване і незрозуміле, але воно датується VisiCalc (1979), і сьогодні воно є принаймні у Microsoft Excel, LibreOffice Calc та Google Sheets. Це в кінцевому рахунку пов'язане з початковою реалізацією LOOKUPVisiCalc (а звідти VLOOKUPі HLOOKUP), коли не було четвертого параметра. Значення знаходить шляхом двійкового пошуку , використовуючи включену ліву та виключну праву межу (загальна та елегантна реалізація), що призводить до такої поведінки.
Технічно це означає, що починається пошук з інтервалу-кандидата [0, n), де nдовжина масиву, а інваріантною умовою циклу є те, що A[imin] <= key && key < A[imax](ліва межа <<ціль, права межа, яка починається одна після закінчення, є > ціль; перевірити значення або перевірити значення в кінцевих точках раніше, або перевірити результат після), і послідовно ділити і вибирати ту сторону, яка зберігає цей інваріант: виключенням однієї сторони буде, поки ви не досягнете інтервалу з 1 терміном [k, k+1), і алгоритм повертається k. Це не повинно бути точно збігом (!): Це лише найближчий збіг знизу. У разі дублювання збігів це призводить до повернення останнього збігу, оскільки вимагає, щоб наступне значення було більшеніж ключ (або кінець масиву). У разі дублікатів вам потрібна певна поведінка, і це розумно і легко здійснити.
Така поведінка прямо вказана в цій старій статті бази знань Microsoft (наголос додано): "XL: Як повернути першу чи останню відповідність у масиві" ( Q214069 ):
Ви можете використовувати функцію LOOKUP () для пошуку значення в масиві відсортованих даних і повернути відповідне значення, що міститься в цій позиції, в іншому масиві. Якщо значення пошуку повторюється в масиві, воно повертає останню зустрічну відповідність . Така поведінка справедлива для функцій VLOOKUP (), HLOOKUP () та LOOKUP ().
Офіційна документація для деяких електронних таблиць слідує; в жодному з них не вказано поведінку "останньої відповідності", але це мається на увазі в документації на Google Таблиці:
Microsoft Excel
TRUE передбачає, що перший стовпець у таблиці відсортований чисельно чи в алфавітному порядку, а потім буде шукати найближче значення .
Google Таблиці :
Якщо is_sortedє TRUEабо пропущено, найближчий збіг ( менше або рівний пошуковому ключу) повертається