带限制和分组依据的平均值

amrnrhlw  于 2021-06-20  发布在  Mysql
关注(0)|答案(2)|浏览(395)

我想做一个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

当前结果:(每个团队所有人的平均值)

显然,不可能在子查询中使用限制。”忽略“按点顺序描述限制2”。
预期结果:

我想要每个队2个最好的人的平均分(最高分),而不是每个队所有人的平均分。
我该怎么做?如果有人知道。。
我在mysql数据库上
小提琴的环节:http://sqlfiddle.com/#!9/8c80ef/1型
谢谢!

hmtdttj4

hmtdttj41#

你可以试试这个。
尝试通过子查询生成订单号,这 order by point 描述。
如果你想得到其他人,那么每个队只能得到前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 |
bgibtngc

bgibtngc2#

这是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
                 );

领带让这件事变得棘手,你的问题是不清楚该怎么办。

相关问题