在MySQL中按状态分组后选择相应的非聚合列
我有一个临时表,是从一个大得多的表派生出来的在MySQL中按状态分组后选择相应的非聚合列,mysql,sql,aggregate-functions,Mysql,Sql,Aggregate Functions,我有一个临时表,是从一个大得多的表派生出来的 +-----+----------+---------+ | id | phone | attempt | +-----+----------+---------+ | 1 | 12345678 | 15 | | 2 | 87654321 | 0 | | 4 | 12345678 | 16 | | 5 | 12345678 | 14 | | 10 | 87654321 |
+-----+----------+---------+
| id | phone | attempt |
+-----+----------+---------+
| 1 | 12345678 | 15 |
| 2 | 87654321 | 0 |
| 4 | 12345678 | 16 |
| 5 | 12345678 | 14 |
| 10 | 87654321 | 1 |
| 11 | 87654321 | 2 |
+-----+----------+---------+
我需要找到对应于每个电话号码的最高尝试的唯一id。电话和尝试不是唯一的
SELECT id, MAX(attempt) FROM temp2 GROUP BY phone
上述查询不会返回对应的最大尝试次数的id。请尝试以下操作:
select
t.*
from temp2 t
inner join (
select phone, max(attempt) attempt
from temp2
group by phone
) t2 on t.phone = t2.phone
and t.attempt = t2.attempt;
它将返回具有给定数字的最大尝试次数的行
请注意,如果一部电话有多行,且尝试次数与该电话的最大尝试次数相同,则此操作将返回多个ID
作为@GurV给出答案的替代方法,您还可以使用相关子查询解决此问题:
SELECT t1.*
FROM temp2 t1
WHERE t1.attempt = (SELECT MAX(t2.attempt) FROM temp2 t2 WHERE t2.phone = t1.phone)
这样做的优点是不太冗长。但我可能会选择join选项,因为它可以更好地扩展大型数据集
显示错误1137 HY000:无法重新打开表:“t”。我之前也遇到过这个问题。原来是因为这是一张临时表。不要使用临时表,而是创建视图或其他表。以上和@Tim的解决方案就是解决这个问题的方法。@Tim-谢谢你的帮助:我开始创建另一个临时表。从temp2 t内部连接中选择t.*在t.phone=t2.phone和t.trunt=t2.trunt上通过电话t2从temp3组中选择msisdn、maxtrunt-trunt@普拉山-不错。我正要建议: