对group by出来的每一组取前十名

本文探讨了在数据库查询中如何在group by分组后,进一步获取每组的前10名记录。针对MySQL、DB2和SQL Server中的限制和局限,提出了使用存储过程作为解决方案的方法,详细介绍了存储过程的创建和调用过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


问题阐述:

    1. 数据库查询的时候group by可以对数据进行分组,然而返回的结果集中,一组只占结果集的一行。

    2. 也就是说,除了对group by出来的信息使用max、min、avg、sum否则查出来的结果信息几乎没有什么意义。(在DB2中尝试,假如不加这些函数是执行不出结果的,会报错;在mysql中,不加这些函数可以出来结果值,不报错,但是结果值其实是没有什么意义的,因为它代表不了整个组的信息,而是整个组中的一条信息,故我认为是没有意义的)

    3.有时候想将数据分组,然后取出每一组的前十名,经尝试,用mysql的limit它直接作用于了最后的结果集,而不是如我所愿的取出每一组的前十个;用DB2的fecth first 10 rows only也是同样效果;sql server的top未曾尝试

    4. 于是想到写存储过程来解决这个需求,写法如下


查询每一组的前十名

delimiter //

drop procedure if exists MyGroup//

CREATE PROCEDURE MyGroup()
begin
  declare num int default 0;
  declare i int default 0;
  set num = (select count(distinct settle_date) from tbl_files);
  while i < num do
    select file_nm,file_id,file_len,settle_date from tbl_files 
    where settle_date = (select settle_date from tbl_files group by settle_date limit i,1) order by file_len DESC limit 10;
    set i=i+1;
  end while;
end//

delimiter ;


使用方法:将以上代码在命令行中运行后,可以通过 show precedure status查看目前已有的存储过程,不出问题可以看到创建的存储过程中有名为MyGroup的存储过程。


调用方法:调用该存储过程则能进行查询了,调用方法是,依旧在mysql的命令行中输入 call MyGroup;


注:select count(distinct settle_date) from tbl_files // 可以查询出总共有多少组





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值