这是应该使用 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
理想情况下,您应该有一个指标索引。
哪一个性能最好主要取决于您的音量,只需尝试两者看看
我有一个 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
理想情况下,您应该有一个指标索引。
哪一个性能最好主要取决于您的音量,只需尝试两者看看