Mysql 这是应该使用窗口功能的情况吗?

Mysql 这是应该使用窗口功能的情况吗?,mysql,sql,where-clause,greatest-n-per-group,Mysql,Sql,Where Clause,Greatest N Per Group,我有一个包含用户ID、团队、ZIP和度量的表: +------+------+--------+--------+ | id | team | zip | metric | +------+------+--------+--------+ | 0001 | t1 | 000000 | 0.0 | | 0001 | t2 | 000001 | 1.0 | | 0002 | t1 | 000000 | 0.0 | | 0002 | t1 | 000001

我有一个包含用户ID、团队、ZIP和度量的表:

+------+------+--------+--------+
|  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具有最高度量的行。如果两个拉链具有相同的度量,请随机选择一个:

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

一个选项使用
行编号()


一个选项使用
行编号()


具体回答这个问题

这是应该使用窗口功能的情况吗

是的,如果你在MySQL 8上,它可以。但老办法也是有效的

@GMB answer提供了
MySQL=>version 8
window函数方式,除此之外,您还可以通过以下方式使用经典组:

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
理想情况下,您应该有一个关于这个度量的索引


哪一个性能最好主要取决于您的容量,只需同时尝试这两个功能,然后查看以明确回答问题

这是应该使用窗口功能的情况吗

是的,如果你在MySQL 8上,它可以。但老办法也是有效的

@GMB answer提供了
MySQL=>version 8
window函数方式,除此之外,您还可以通过以下方式使用经典组:

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
理想情况下,您应该有一个关于这个度量的索引


哪一个性能最好?这主要取决于您的卷数,两个都试一下,看看您的主键是什么?草莓没有。表是按原样提供给我的。是的,这是一个很好的窗口函数用例。你的主键是什么?@草莓没有。表是按原样提供给我的。是的,这是窗口函数的一个很好的用例。出于某种原因,内部查询为每个row@hitodo9051:这将给出一行pr
(zip、team、id)
元组。查看您的数据,我怀疑您不希望
partitionby
子句中出现
zip
(尽管您的问题并不是这样说的),因此:
row\u number()over(partitionby team,id order by metric desc)
出于某种原因,内部查询会为每个row@hitodo9051:这将给出一行pr
(zip,team,id)
tuple。查看您的数据,我怀疑您不想在
partitionby
子句中使用
zip
(尽管这不是您的问题所说的),所以:
row\u number()over(partitionby team,id order by metric desc)