在动态范围内对子组进行排名

Rank subgroup within dynamic range

我有这样的投资回报率比较 table:

Month | ROI | 1  | 2  | 3  |
Jul   | A   | 1% | 
Jul   | B   | 3% |
Jul   | C   | 2% |
Jun   | A   | 4% | 6% |
Jun   | B   | 5% | 7% |
Jun   | C   | 6% | 8% |
May   | A   | 2% | 4% | 7% |
May   | C   | 3% | 5% | 6% |

我想每个月对每个产品的投资回报率(A、B 和 C)进行排名 - 因此只对给定月份的最正确百分比进行排名。

但是范围需要是动态的,因为每个产品可能有不同的发布日期。例如,五月没有产品 B。

所以输出将是:

   Month  | ROI | 1  | 2  | 3  | Rank
    Jul   | A   | 1% |    |    | 3
    Jul   | B   | 3% |    |    | 1
    Jul   | C   | 2% |    |    | 2
    Jun   | A   | 4% | 6% |    | 3
    Jun   | B   | 5% | 7% |    | 2
    Jun   | C   | 6% | 8% |    | 1
    May   | A   | 2% | 4% | 7% | 1
    May   | C   | 3% | 5% | 6% | 2

我正在考虑使用 Index/Match 函数:

=RANK(INDEX(G3:S3,MATCH(9^99,G3:S3,1)),G3:G5,0)

但我不确定如何使 G3:G5 动态化。

我想我设法让它在排名列中使用以下公式:

=RANK(OFFSET(G3,,SUM(--ISNUMBER(G3:S3))-1),
      OFFSET(G3,COUNTIF(E3:$E9,E3)-COUNTIF($E:$E9,E3),
                SUM(--ISNUMBER(G3:S3))-1,COUNTIF($E:$E9,E3)))

(假设您的月份在 E1:E999)。

这样做是查看 G3 并使用 OFFSET 移动到最右边的非空 (ISNUMBER) 列,并认为该值在 OFFSET 数组,其中月份与当前行的月份匹配。

让我们分解第二个 OFFSET 公式(假设我们正在考虑 Jul 行):

  • G3 开始。
  • 行偏移量:当前行(含)以下 Jul 行的计数 - Jul 行的总计数。
  • 列偏移量:当前行中包含数字的单元格计数 - 1
  • 高度:Jul 行的总数。

这是一个数组公式,所以必须使用Ctrl+Shift+Enter[=51输入=].

注意:如果月份相同,公式假定最右边的值在同一列中。这适用于您给出的示例,但我不知道它是否适用于您的完整数据集。如果通常情况并非如此,您可以使用公式

的第一个 OFFSET 部分创建辅助列
=OFFSET(G3,,SUM(--ISNUMBER(G3:S3))-1)

获取每一行中最右边的数字,然后在该辅助列上进行排名。

从使用 COUNTIFS function 的简单分组排名开始。

=COUNTIFS(A:A, A2, C:C, "<="&C2)

使用 INDEX on a multiple column range with an approximate MATCH.

修改百分比范围以捕获该行中最右边的数字
=COUNTIFS(A:A, A2, INDEX(A:F, 0, MATCH(1E+99, A2:F2)), ">="&INDEX(A:F, ROW(2:2), MATCH(1E+99, A2:F2)))

根据需要填写。