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

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

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

hliyouheng 回答:MySQL - 使用某些条件从每个组中使用一个值

您可以使用 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

本文链接:https://www.f2er.com/13033.html

大家都在问