如何按俱乐部排名,按俱乐部分组以及俱乐部内的三个最佳成绩

问题描述 投票:0回答:2

我有mysql表“ runners”,需要从俱乐部获得最佳三个跑步者时间,并从这些跑步者获得排名俱乐部的结果。在下面的示例中。我尝试使用BY BY俱乐部,但是需要所有跑步者的成绩,而不是三项最佳成绩

示例表

id  name    club    time
1   pero    name1   12:11:01
2   marko   name1   12:14:02
3   ante    name1   12:18:05
4   josipa  name1   12:05:02
5   iva     name1   12:08:00
6   vijeko  name2   12:25:01
7   alen    name2   12:31:05
8   antonia name2   12:14:08
9   boris   name2   12:15:19
10  miro    name3   12:17:20
11  ines    name3   12:18:20
12  robert  name3   12:33:11
13  Ivana   name3   12:08:00
14  Ana     name3   12:01:05

总成绩最好的跑步者和排名俱乐部

josipa    name1 12:05:02
snjezana  name1 12:08:00
ante      name1 12:18:05
Total time      36:31:07

Ana     name3   12:01:05
Ivana   name3   12:08:00
miro    name3   12:17:20
Total time      36:26:25        

antonia name2   12:14:08
boris   name2   12:15:19
alen    name2   12:31:05
Total time      37:00:32
mysql sql greatest-n-per-group
2个回答
0
投票

在MySQL 8.0中,您可以为此使用窗口函数:

select *
from (
    select t.*, rank() over(partition by club order by time) rn
    from mytable t
) t
where rn <= 3

这里是使用通用表表达式生成汇总的一种方法:

with cte as (
    select *
    from (
        select t.*, rank() over(partition by club order by time) rn
        from mytable t
    ) t
    where rn <= 3
) 
(select name, club, time from cte)
union all (select name, 'Total time', sum(time) from cte group by name)
order by club, time 

0
投票

如果您使用的是mysql 5.6或5.7,则必须使用会话变量,并且比mysql 8难看一些

CREATE TABLE timetable (
  `id` INTEGER,
  `name` VARCHAR(13),
  `club` VARCHAR(8),
  `time` TIME
);
INSERT INTO timetable
  (`id`, `name`, `club`, `time`)
VALUES
  ('1', 'pero', 'name1', '12:11:01'),
  ('2', 'marko', 'name1', '12:14:02'),
  ('3', 'ante', 'name1', '12:18:05'),
  ('4', 'josipa', 'name1', '12:05:02'),
  ('5', 'iva', 'name1', '12:08:00'),
  ('6', 'vijeko', 'name2', '12:25:01'),
  ('7', 'alen', 'name2', '12:31:05'),
  ('8', 'antonia', 'name2', '12:14:08'),
  ('9', 'boris', 'name2', '12:15:19'),
  ('10', 'miro', 'name3', '12:17:20'),
  ('11', 'ines', 'name3', '12:18:20'),
  ('12', 'robert', 'name3', '12:33:11'),
  ('13', 'Ivana', 'name3', '12:08:00'),
  ('14', 'Ana', 'name3', '12:01:05');
SELECT
    `name`,
    tta.`club`,
  `time`,
    totaltime
FROM
  (
  SELECT
  `name`, `time`
  ,IF(@club = `club`,@rnk := @rnk  + 1,@rnk := 1) rnk
  ,@club := `club` `club`
  FROM
  (SELECT * FROM timetable ORDER BY club ASC,`time` ASC) tt, (SELECT @rnk := 0) a,(SELECT @club := '') b
  ) tta 
  inner JOIN (
  SELECT 
  `club`,
  SEC_TO_TIME(SUM(TIME_TO_SEC(`time`))) as totaltime
  FROM (
  SELECT
   `time`
  ,IF(@club = `club`,@rnk := @rnk  + 1,@rnk := 1) rnk
  ,@club := `club` `club`
  FROM
      (SELECT * FROM timetable ORDER BY club ASC,`time` ASC) tt, (SELECT @rnk := 0) a,(SELECT @club := '') b) ttb  
      WHERE rnk <= 3
      GROUP BY `club` 
      ) ttb 
  ON tta.`club`  = ttb.`club`
WHERE tta.rnk <= 3
名称|俱乐部|时间|总时间:------ | :---- | :------- | :--------iva |名称1 | 12:08:00 | 36:24:03佩罗|名称1 | 12:11:01 | 36:24:03乔西帕|名称1 | 12:05:02 | 36:24:03antonia | name2 | 12:14:08 | 36:54:28鲍里斯| name2 | 12:15:19 | 36:54:28vijeko | name2 | 12:25:01 | 36:54:28安娜|名称3 | 12:01:05 | 36:26:25伊万娜|名称3 | 12:08:00 | 36:26:25miro |名称3 | 12:17:20 | 36:26:25

db <>小提琴here

© www.soinside.com 2019 - 2024. All rights reserved.