(Відповідаючи тут, як немає окремого запитання щодо відсортованих даних.)
Якщо дані були відсортовані, можна використовувати VLOOKUP
з range_lookup
аргументом TRUE
(або опущено, так як це за замовчуванням), який офіційно описаний для Excel , як «пошук приблизного матчу».
Іншими словами, для відсортованих даних:
- встановлення останнього аргументу для
FALSE
повернення першого значення та
- встановлення останнього аргументу для
TRUE
повернення останнього значення.
Це значною мірою незадокументоване і незрозуміле, але воно датується VisiCalc (1979), і сьогодні воно є принаймні у Microsoft Excel, LibreOffice Calc та Google Sheets. Це в кінцевому рахунку пов'язане з початковою реалізацією LOOKUP
VisiCalc (а звідти 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
або пропущено, найближчий збіг ( менше або рівний пошуковому ключу) повертається