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。
我在 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。