这是应该使用 window 函数的情况吗?

Is this a case where window function should be used?

我有一个 table,其中包含用户 ID、团队、邮编和指标:

+------+------+--------+--------+
|  id  | team |  zip   | metric |
+------+------+--------+--------+
| 0001 | t1   | 000000 |    0.0 |
| 0001 | t2   | 000001 |    1.0 |
| 0002 | t1   | 000000 |    0.0 |
| 0002 | t1   | 000001 |    1.0 |
| 0003 | t2   | 000000 |    0.0 |
| 0003 | t2   | 000001 |    0.0 |
+------+------+--------+--------+

我只需要每个邮政编码、团队和 ID 具有最高指标的行。如果两个 zip 具有相同的公制,则随机选择一个:

+------+------+--------+--------+
|  id  | team |  zip   | metric |
+------+------+--------+--------+
| 0001 | t1   | 000000 |    0.0 |
| 0001 | t2   | 000001 |    1.0 |
| 0002 | t1   | 000001 |    1.0 |
| 0003 | t2   | 000000 |    0.0 |
+------+------+--------+--------+

一个选项使用 row_number():

select *
from (
    select t.*, row_number() over(partition by zip, team, id order by metric desc) rn 
    from mytable t
) t
where rn = 1

具体回答问题

is this a case where window function should be used?

是的,如果您使用 MySQL8,可以。但是旧方法也有效。

替代@GMB answer,它提供了 MySQL => version 8 window 函数方式,你仍然可以使用经典的 GROUP BY :

SELECT T.*
FROM the_table T
INNER JOIN
(
    SELECT MIN(id) AS id, metric
    FROM the_table
    GROUP by metric
) G ON T.id=G.id

理想情况下,您应该有一个指标索引。

哪一个性能最好主要取决于您的音量,只需尝试两者看看