mysql查询各个分组中的前几名应该怎么做?

发布于 2022-09-05 05:23:45 字数 1015 浏览 19 评论 0

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

模样如下:
clipboard.png

数量大概是500W

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

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

clipboard.png

结果是

clipboard.png

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

相思故 2022-09-12 05:23:46

能知道explain,为什么表还能建成这样?选择合适的字段类型优化表结构吧

绝對不後悔。 2022-09-12 05:23:46

先问你一个问题,敢问兄台从业多久了?

你的主要问题是数据类型,选择合适的数据类型才好

从你的表结构看,所有字段mysql都有对应类型,就算经纬度mysql也有

把回忆走一遍 2022-09-12 05:23:45

这表这样子建出来我是dba会打死你的,text简直万能的了,你先改好你的表结构再优化吧..
时间就用date或者datetime,名称地址varchar够了,人数int上限十亿不够用吗?
改完以后日期字段加个索引足够你用了

对了,看你的起始时间用char(8)最好

还有结束时间..

where结果集还这么大..那就日期索引改成(日期,起始时间,进站人数,出战人数)

------------------------分割线--------------------------

索引中的字段顺序是很重要的,你昨天的问题日期字段是应该第一位的,起始时间第二位,后面两个顺序可以随便放。

改了问题都没地方给你回答了,你应该另开一个问题的。。

至于分组取前几名这种问题,通用的解法就是按组排序引入组内行号再取行号<N的记录即可,sql如下:

select 起始时间,线路,进站人数 
from 
    (select 
        @gn:=case when @起始时间=起始时间 then @gn+1 else 1 end gn,@起始时间:=起始时间 起始时间,线路,进站人数
    from t,(select @gn:=0) b 
    order by 起始时间,进站人数 desc) aa 
where gn<=10;
ぺ禁宫浮华殁 2022-09-12 05:23:45

用explain,把执行计划放到问题后面,方便大家进行分析。

这个语句,如果“日期”字段有索引,应该在执行计划中能看到用了索引。

风透绣罗衣 2022-09-12 05:23:45

索引加在哪几列? where filter后数据量还有多少?

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文