mysql优化 - 我的mysql如何分组取top10?

查看:275
本文介绍了mysql优化 - 我的mysql如何分组取top10?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问 题

mysql 5.7.18

表DDL如下

CREATE TABLE 'roadnet_monitor_flowdata2' (
  'id' INT(10) DEFAULT NULL,
  '交通类型' VARCHAR(4),
  '出站人数' INT(10) DEFAULT NULL,
  '日期' date,
  '站点' VARCHAR(20),
  '纬度' double DEFAULT NULL,
  '线路' VARCHAR(8),
  '经度' double DEFAULT NULL,
  '结束时间' CHAR(8),
  '起始时间' CHAR(8),
  '进站人数' INT(10) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8

模样如下:

数量大概是500W

现在我被一个需求难住了,选取各个起始时间线路进站人数的top10,也就是说要按起始时间分为72组,每组的线路按进站人数排序,选出72组top10

各种查也没有头绪。。。该怎么办呢?
索引如下:

根据高人指点,我写了一个sql语句

select @ln:=case when @起始时间=起始时间 then @ln+1 else 1 end ln,@起始时间:=起始时间 起始时间,线路,进站总数 
from 
    (select 起始时间,线路,sum(进站人数) as 进站总数
    from roadnet_monitor_flowdata2,(select @ln:=0) b 
    group by 起始时间,线路
    order by 起始时间,sum(进站人数) desc) aa
having ln <= 10;

结果是

大家看到,ln不知道怎么回事,中间隔了一个,导致top10变成top6

另一个sql语句

select 起始时间,线路,进站总人数,gn from
(select 
@gn:=case when @起始时间=起始时间 then @gn+1 else 1 end gn,@起始时间:=起始时间 起始时间,线路,sum(进站人数) as 进站总人数
from roadnet_monitor_flowdata2 t,(select @gn:=0) b
group by 起始时间,线路 order by 起始时间,进站总人数 desc) aa
where gn<=10 limit 100;

结果是

而这个gn全是1,gn<=10 完全没用,不是top10,而是全排行了。

到底该怎么办?

解决方案

试试这个,应该没问题了:

select 起始时间,线路,进站总人数 
from (
select @gn:=case when @起始时间=起始时间 then @gn+1 else 1 end gn,@起始时间:=起始时间 起始时间,线路,进站总人数 from (
select 起始时间,线路,sum(进站人数) 进站总人数
from roadnet_monitor_flowdata2
group by 起始时间,线路) aa,(select @gn:=1) bb
order by 起始时间,进站总人数 desc) aaa
where gn<=10;

这篇关于mysql优化 - 我的mysql如何分组取top10?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆