Mysql 这是应该使用窗口功能的情况吗?
我有一个包含用户ID、团队、ZIP和度量的表: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 | 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)