MySQL - 使用某些条件下每组中的一个值

MySQL - using one value from each group using some conditions

我在 MySQL 中有一个这样的 table。我想计算值的平均值(列值)但不使用所有行。从每个组(列组)我只想使用一个值,如果该组中有多个行,则排名最高(列排名)。

+----+-------+-------+------+
| ID | Value | Group | Rank |
+----+-------+-------+------+
|  1 |    10 |     1 |    1 |
+----+-------+-------+------+
|  2 |     9 |     1 |    2 |
+----+-------+-------+------+
|  3 |     7 |     2 |    2 |
+----+-------+-------+------+
|  4 |    10 |     2 |    1 |
+----+-------+-------+------+
|  5 |    11 |     3 |    1 |
+----+-------+-------+------+
|  6 |     9 |     4 |    1 |
+----+-------+-------+------+
|  7 |     8 |     5 |    1 |
+----+-------+-------+------+
|  8 |    10 |     6 |    2 |
+----+-------+-------+------+
|  9 |     9 |     7 |    1 |
+----+-------+-------+------+

因此,在第 1 组中,我必须使用行 ID 2 中的值 9,因为它的排名最高。在第 2 组中,我将使用行 ID 3 中的值 7,因为它的排名最高。其余的我将使用唯一的值,因为没有其他选择。 最后,我想计算第 2、3、5、6、7、8、9 行的平均值。 我怎样才能在一个查询中做到这一点?

您可以使用 NOT EXISTS 仅过滤每个组中排名最高的行:

SELECT AVG(t1.Value) avg_value
FROM tablename t1
WHERE NOT EXISTS (
  SELECT 1
  FROM tablename t2
  WHERE t2.group = t1.group AND t2.rank > t1.rank
)

或者,使用相关子查询:

SELECT AVG(t1.Value) avg_value
FROM tablename t1
WHERE t1.rank = (SELECT MAX(t2.rank) FROM tablename t2 WHERE t2.group = t1.group)

参见demo