Среднее значение за последние 7 непустых непустых ячеек в Google Sheets

11

У меня есть числа в диапазоне D7: D и бывают случаи, когда некоторые ячейки пусты. Я хочу усреднить последние 7 чисел, но пропустить пропуски. Так что, если в последних 7 есть только 3, которые заполнены, я хочу вернуться и найти 7 итогов и усреднить их.

Губка Боб Квадратные Штаны
источник

Ответы:

6

Вот один из подходов:

=average(indirect("D" & iferror(large(filter(row(D7:D), len(D7:D)), 7), row(D7)) & ":D"))

Объяснение:

  • filter(row(D7:D), len(D7:D)) возвращает массив, состоящий из номеров строк непустых записей в заданном диапазоне.
  • large(..., 7) выбирает 7-е наибольшее число из этого массива: это номер строки, с которого вы хотите начать усреднение.
  • iferror(..., row(D7))является гарантией, если в вашем диапазоне менее 7 непустых записей: в этом случае усреднение начнется с D7. Я мог бы просто поставить «7» вместо row(D7), но row(D7)делает формулу более переносимой, если вы решите скопировать ее в другое место.
  • indirect("D" & ... & ":D")формирует диапазон для усреднения, например, D9:Dесли результат предыдущего вычисления был 9.
  • Наконец, averageв среднем. Вы также можете разместить здесь другие агрегатные функции.

источник
работает и обновляет новые изменения!
Губка Боб Квадратные Штаны
Спасибо, но теперь я думаю, что ответ JPV должен быть принят: он более прост и более семантически естественен.
это не обновлялось должным образом для меня, я думал, что это было также легче, но как только я добавил больше номеров, это не работало.
Губка Боб Квадратные Штаны
6

TL; DR

=AVERAGE(OFFSET(A:A;COUNT(A:A)-7 + MATCH(TRUE;INDEX(A:A<>0);0)-1;0))

пример

введите описание изображения здесь

объяснение

  • Сначала мы посчитаем, сколько чисел в строке A с =COUNT(A:A). Клетки, содержащие текст, не учитываются. Наш пример даст нам9
  • Из этого числа вычесть 7 , так как вы хотите , среднее за последние 7 значений: =COUNT(A:A)-7. Это даст нам 2.
  • Теперь мы используем функцию смещения для получения диапазона полного столбца, но со смещением в 2 ячейки, что фактически означает, что у нас осталась только часть столбца с оставшимися ровно 7 значениями

    Представьте столбец без пустых ячеек перед первой ячейкой со значениями. Тогда упрощенный пример может выглядеть так =OFFSET(A:A; COUNT(A:A)-7 ;0). Но это не сработает, как только столбец начинается с пустых ячеек, как показано на рисунке выше.

  • Теперь нам нужно увеличить смещение на количество пустых ячеек. Это не значит, что мы считаем все пустые значения подряд. Только те, что перед первой непустой ячейкой.

    Вы можете сосчитать их =MATCH(TRUE;INDEX(A:A<>0);0)-1и получить 6как результат или наш пример

    Теперь мы изменим нашу функцию смещения и добавим это количество, чтобы получить правильный диапазон, содержащий только 7 значений
    OFFSET(A:A; COUNT(A:A)-7 + MATCH(TRUE;INDEX(A:A<>0);0)-1 ;0)

    введите описание изображения здесь

  • В качестве последнего шага мы рассчитаем среднее значение этого диапазона. Наш пример даст нам 4 в результате, так как в среднем 1,2,3,4,5,6,7 равно 4.
    =AVERAGE(OFFSET(A:A;COUNT(A:A)-7 + MATCH(TRUE;INDEX(A:A<>0);0)-1;0))

nixda
источник
Отличный ответ.
эль
он работал нормально, но как только я добавил еще одну ячейку, он не обновился должным образом?
Губка Боб Квадратные Штаны
2

Еще один способ:

=AVERAGE(ARRAY_CONSTRAIN(SORT(FILTER(A:A, ISNUMBER(A:A)), 1, 1), 7, 1))

Explantion:

  1. отфильтровать все числовые значения
  2. перевернуть столбец вверх ногами (чтобы последние значения были выше) с помощью sort ()
  3. ограничить вывод этого столбца до 7 строк (используя ARRAY_CONSTRAIN)
  4. Возьми среднее ...

РЕДАКТИРОВАТЬ: Извините за недоразумение. Выше усреднены самые большие 7 значений, а не последние 7 значений в столбце. Для усреднения по последним 7 значениям решение Нормального Человека является отличным. Альтернативным способом с меньшим количеством функций было бы использование QUERY ()

Предполагая числовые данные в столбце A, попробуйте:

=AVERAGE(QUERY(ARRAYFORMULA({ROW(A:A),A:A}),"select Col2 where Col2 is not null order by Col1 desc limit 7", 0))
JPV
источник
0

=AVERAGE(IFERROR(QUERY(D7:D, 
 "where D is not null 
  offset "&COUNTA(QUERY(D7:D, "where D is not null", 0)) - 7, 0)))

0

Пользователь0
источник