在动态范围内对子组进行排名
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)))
根据需要填写。
我有这样的投资回报率比较 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)))
根据需要填写。