いきなり答える備忘録

G Suite・Microsoft 365・LibreOfficeなどに関するメモと日々の実験

(Excel)グループ別の最大値・最小値を求める

 Excelで、多数の数値を個々のグループごとに区別して、それぞれの最大値・最小値を求める方法についてです。

  • FILTER関数とMAXIFS(MINIFS)関数を組み合わせて、グループ別の最大値・最小値を求めることができます。

手順

 画像では、B列に氏名が、C列にスコアの数値が並んでいます。
 そこでE3セルに式を入力し、それぞれの氏名ごとのスコアの最大値を求めています。

f:id:accs2014:20210422022337p:plain:w650

 E3セル

=UNIQUE(FILTER(B3:C13,C3:C13=MAXIFS(C3:C13,B3:B13,B3:B13)))

 まずFILTER関数内で抽出条件にMAXIFS関数を用いて、各行(3~13行目)の氏名に対応する最高スコアの行(氏名と最高スコアの組)を抽出しています。
 MAXIFSの第2引数(条件範囲)と第3引数(条件)が同じ「B3:B13」になっているわかりにくいですが、つぎの式をいっぺんに実行していると考えればわかりやすいかもしれません。

=FILTER(B3:C13,C3:C13=MAXIFS(C3:C13,B3:B13,B3))
=FILTER(B3:C13,C3:C13=MAXIFS(C3:C13,B3:B13,B4))
・・・
=FILTER(B3:C13,C3:C13=MAXIFS(C3:C13,B3:B13,B13))

 結果的に氏名ごとの最高スコアが求まりますが、重複する行が多数出力されるためUNIQUE関数で重複を除いています。
 なおMAXIFS関数をMINIFS関数に替えると最小値が求まります。

 

 次の画像もほとんど同じ例ですが、B列にチーム名を追加し、チームごとのスコアの最大値を求めています。
 チーム名とスコアだけでなく氏名まで抽出できているところがポイントで、SQL的なグループ化集計だとちょっと苦労するところですが、上記と同じような式で求めることができます。

f:id:accs2014:20210422022342p:plain:w650

 F3セル

=UNIQUE(FILTER(B3:D13,D3:D13=MAXIFS(D3:D13,B3:B13,B3:B13)))

 ただし、同一チームで複数の者が最高スコアを出している場合にはUNIQUE関数で1つにまとめることができず(氏名の行が異なるため)、複数の行が出力されます。