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

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

我想做一个sql查询,但我做不到。。。我找不到像我这样的例子。
我有一个简单的表,有3列7条记录:

我想为每一队得到2个最好的人的平均分。
我的问题:

  1. SELECT team
  2. , (SELECT AVG(point)
  3. FROM People t2
  4. WHERE t1.team = t2.team
  5. ORDER
  6. BY point DESC
  7. LIMIT 2) as avg
  8. FROM People t1
  9. GROUP
  10. BY team

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

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

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

hmtdttj4

hmtdttj41#

你可以试试这个。
尝试通过子查询生成订单号,这 order by point 描述。
如果你想得到其他人,那么每个队只能得到前2排 top 数字只需修改中的数字 where 条款。

  1. CREATE TABLE `People` (
  2. `id` int(11) NOT NULL,
  3. `name` varchar(20) NOT NULL,
  4. `team` varchar(20) NOT NULL,
  5. `point` int(4) NOT NULL
  6. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
  7. INSERT INTO `People` (`id`, `name`, `team`, `point`) VALUES
  8. (1, 'Luc', 'Jupiter', 10),
  9. (2, 'Marie', 'Saturn', 0),
  10. (3, 'Hubert', 'Saturn', 0),
  11. (4, 'Albert', 'Jupiter', 50),
  12. (5, 'Lucy', 'Jupiter', 50),
  13. (6, 'William', 'Saturn', 20),
  14. (7, 'Zeus', 'Saturn', 40);
  15. ALTER TABLE `People`
  16. ADD PRIMARY KEY (`id`);
  17. ALTER TABLE `People`
  18. MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=8;

查询1:

  1. SELECT team,avg(point) totle
  2. FROM People t1
  3. where (
  4. select count(*)
  5. from People t2
  6. where t2.id >= t1.id and t1.team = t2.team
  7. order by t2.point desc
  8. ) <=2 ## if you want to get other `top` number just modify this number
  9. group by team

结果:

  1. | team | totle |
  2. |---------|-------|
  3. | Jupiter | 50 |
  4. | Saturn | 30 |
展开查看全部
bgibtngc

bgibtngc2#

这是mysql的一大难题。如果需要两个最高点的值,可以执行以下操作:

  1. SELECT p.team, AVG(p2.point)
  2. FROM people p
  3. WHERE p.point >= (SELECT DISTINCT p2.point
  4. FROM people p2
  5. WHERE p2.team = p.team
  6. ORDER BY p2.point DESC
  7. LIMIT 1, 1 -- get the second one
  8. );

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

相关问题