AVG有LIMIT和GROUP BY
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了AVG有LIMIT和GROUP BY相关的知识,希望对你有一定的参考价值。
我正在寻找一个SQL查询,但我不能这样做......我找不到像我这样的例子。
我有一个简单的表人3列,7记录:
我想为每支球队得分,平均得分为2分。
我的查询:
SELECT team
, (SELECT AVG(point)
FROM People t2
WHERE t1.team = t2.team
ORDER
BY point DESC
LIMIT 2) as avg
FROM People t1
GROUP
BY team
目前的结果:(每个团队的所有人的平均值)
显然,不可能对子查询使用限制。 “ORDER BY point DESC LIMIT 2”被忽略。
结果预期:
我希望每支球队的平均得分为2人(最高分),而不是每支球队所有人的平均得分。
我怎样才能做到这一点?如果有人有任何想法..
我在mysql数据库上
小提琴的链接:http://sqlfiddle.com/#!9/8c80ef/1
谢谢 !
答案
你可以试试这个。
尝试通过子查询创建一个订单号,order by point
desc。
然后每个团队只获得前2行,如果你想获得其他top
数字只需修改where
子句中的数字。
CREATE TABLE `People` (
`id` int(11) NOT NULL,
`name` varchar(20) NOT NULL,
`team` varchar(20) NOT NULL,
`point` int(4) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
INSERT INTO `People` (`id`, `name`, `team`, `point`) VALUES
(1, 'Luc', 'Jupiter', 10),
(2, 'Marie', 'Saturn', 0),
(3, 'Hubert', 'Saturn', 0),
(4, 'Albert', 'Jupiter', 50),
(5, 'Lucy', 'Jupiter', 50),
(6, 'William', 'Saturn', 20),
(7, 'Zeus', 'Saturn', 40);
ALTER TABLE `People`
ADD PRIMARY KEY (`id`);
ALTER TABLE `People`
MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=8;
查询1:
SELECT team,avg(point) totle
FROM People t1
where (
select count(*)
from People t2
where t2.id >= t1.id and t1.team = t2.team
order by t2.point desc
) <=2 ## if you want to get other `top` number just modify this number
group by team
| team | totle |
|---------|-------|
| Jupiter | 50 |
| Saturn | 30 |
另一答案
这是MySQL的痛苦。如果您想要两个最高点值,您可以:
SELECT p.team, AVG(p2.point)
FROM people p
WHERE p.point >= (SELECT DISTINCT p2.point
FROM people p2
WHERE p2.team = p.team
ORDER BY p2.point DESC
LIMIT 1, 1 -- get the second one
);
关系让这个变得棘手,你的问题并不清楚如何处理它们。
以上是关于AVG有LIMIT和GROUP BY的主要内容,如果未能解决你的问题,请参考以下文章
jdk8 stream实现sql单表select a,b,sum(),avg(),max() from group by a,b order by a,b limit M offset N及其性能