Durchschnitt der letzten 7 nicht leeren nicht leeren Zellen in Google Sheets

11

Ich habe Zahlen im Bereich D7: D und es gibt Zeiten, in denen einige Zellen leer sind. Ich möchte den Durchschnitt der letzten 7 Zahlen, aber Leerzeichen überspringen. Wenn also in den letzten 7 nur 3 voll sind, möchte ich, dass es weiter zurückgeht und insgesamt 7 findet und diese herausrechnet.

Spongebob Schwammkopf
quelle

Antworten:

6

Hier ist ein Ansatz:

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

Erläuterung:

  • filter(row(D7:D), len(D7:D)) Gibt ein Array zurück, das aus den Zeilennummern der nicht leeren Einträge im angegebenen Bereich besteht.
  • large(..., 7) wählt die siebtgrößte Zahl aus diesem Array aus: Dies ist die Zeilennummer, in der Sie mit der Mittelwertbildung beginnen möchten.
  • iferror(..., row(D7))ist ein Schutz für den Fall, dass Ihr Bereich weniger als 7 nicht leere Einträge enthält. In diesem Fall beginnt die Mittelwertbildung mit D7. Ich hätte einfach "7" anstelle von "7" setzen row(D7)können, row(D7)macht die Formel jedoch portabler, falls Sie sie an eine andere Stelle kopieren möchten.
  • indirect("D" & ... & ":D")bildet den Bereich für die Mittelwertbildung, z. B. D9:Dwenn die Ausgabe der vorhergehenden Berechnung 9 war.
  • Schließlich averagemacht der Durchschnitt. Sie können hier auch andere Aggregatfunktionen einfügen.

quelle
funktioniert & aktualisiert auf neue Änderungen!
SpongeBob Schwammkopf
Danke, aber jetzt denke ich, dass die Antwort von JPV die akzeptierte sein sollte: Es ist einfacher und semantisch natürlicher.
es wurde für mich nicht richtig aktualisiert, ich dachte, es wäre auch einfacher, aber sobald ich mehr Zahlen hinzugefügt habe, hat es nicht funktioniert.
SpongeBob Schwammkopf
6

TL; DR

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

Beispiel

Geben Sie hier die Bildbeschreibung ein

Erläuterung

  • Zuerst zählen wir, mit wie vielen Zahlen in Zeile A steht =COUNT(A:A). Zellen, die Text enthalten, werden nicht gezählt. Unser Beispiel würde uns geben9
  • Von dieser Zahl subtrahieren wir 7, da Sie den Durchschnitt der letzten 7 Werte wollen : =COUNT(A:A)-7. Dies wird uns eine geben 2.
  • Jetzt verwenden wir die Versatzfunktion, um einen Bereich einer vollständigen Spalte zu erhalten, jedoch mit einem Versatz von 2 Zellen, was effektiv bedeutet, dass nur noch ein Teil einer Spalte mit genau 7 verbleibenden Werten übrig ist

    Stellen Sie sich eine Spalte ohne leere Zellen vor der ersten Zelle mit Werten vor. Dann könnte ein vereinfachtes Beispiel aussehen =OFFSET(A:A; COUNT(A:A)-7 ;0). Dies funktioniert jedoch nicht, sobald die Spalte mit leeren Zellen beginnt (siehe Abbildung oben)

  • Wir müssen jetzt unseren Versatz um die Anzahl der leeren Zellen erweitern. Das bedeutet nicht, dass wir alle leeren Werte in einer Reihe zählen. Nur die vor der ersten nicht leeren Zelle.

    Sie können sie mit zählen =MATCH(TRUE;INDEX(A:A<>0);0)-1und 6als Ergebnis oder unser Beispiel erhalten

    Jetzt ändern wir unsere Offset-Funktion und addieren diese Anzahl, um den richtigen Bereich mit nur 7 Werten zu erhalten
    OFFSET(A:A; COUNT(A:A)-7 + MATCH(TRUE;INDEX(A:A<>0);0)-1 ;0)

    Geben Sie hier die Bildbeschreibung ein

  • Als letzten Schritt berechnen wir den Durchschnitt dieses Bereichs. Unser Beispiel würde uns 4 als Ergebnis geben, da der Durchschnitt von 1,2,3,4,5,6,7 4 ist.
    =AVERAGE(OFFSET(A:A;COUNT(A:A)-7 + MATCH(TRUE;INDEX(A:A<>0);0)-1;0))

Nixda
quelle
Hervorragende Antwort.
Ale
es hat gut funktioniert, aber nachdem ich eine weitere Zelle hinzugefügt habe, wurde es nicht richtig aktualisiert?
SpongeBob Schwammkopf
2

Noch ein anderer Weg:

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

Explantation:

  1. alle numerischen Werte herausfiltern
  2. Drehen Sie die Spalte mit sort () auf den Kopf (so dass die letzten Werte oben liegen).
  3. Beschränken Sie die Ausgabe dieser Spalte auf 7 Zeilen (mit ARRAY_CONSTRAIN).
  4. Nehmen Sie den Durchschnitt ...

EDIT: Entschuldigung für das Missverständnis. Der obige Wert ergibt die GRÖSSTEN 7 Werte, nicht die letzten 7 Werte in einer Spalte. Die letzten 7 Werte zu mitteln Die Lösung von Normal Human ist großartig. Eine alternative Möglichkeit mit weniger Funktionen wäre die Verwendung von QUERY ()

Versuchen Sie unter Annahme der numerischen Daten in Spalte A:

=AVERAGE(QUERY(ARRAYFORMULA({ROW(A:A),A:A}),"select Col2 where Col2 is not null order by Col1 desc limit 7", 0))
JPV
quelle
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

user0
quelle