Office中国论坛/Access中国论坛

标题: 先分组,再取每组前3名,如何实现呢 [打印本页]

作者: QQ6170372    时间: 2016-2-19 16:11
标题: 先分组,再取每组前3名,如何实现呢
先分组,再取每组前3名,如何实现呢
作者: tmtony    时间: 2016-2-19 16:31
select top 3 字段  from 表 group by 字段
试试
作者: QQ6170372    时间: 2016-2-19 17:13
这样取不了每组前3,取的是总体前3
作者: 风中漫步    时间: 2016-2-20 09:26
看看你的数据
作者: xuwenning    时间: 2016-2-22 08:55
select  字段  from 表 group by 字段查询
select  top 3 字段  from查询 group by 字段

作者: xinrenq    时间: 2016-2-23 08:07
用SQL语句的方式呢,在ACCESS只能用Count计数嵌套子查询后,再来通过Where 来判断Count的大小来取数据,数据量小时还凑合,
如:  

按name分组取最小的两个(N个)val

代码如下:

select a.* from tb a where 2 > (select count(*) from tb where name = a.name and val < a.val ) order by a.name,a.valselect a.* from tb a where val in (select top 2 val from tb where name=a.name order by val) order by a.name,a.val
select a.* from tb a where exists (select count(*) from tb where name = a.name and val < a.val having Count(*) < 2) order by a.name      ----网上抄的。。

如果是MSSQL呢,有个row_number的函数(排序行号),对这个就是大小判断就行了。效率最好

另一种方式是用游标方式,因为MSSQL有自身的游标,所以效果仅次于row_number,ACCESS的话用ADO或DAO游标,方法比较简单些,只是要写一定的VBA代码

这个题看起来简单,做起来,很多的人会想到 Top +group by 的方式,相关贴呢,自已问度娘。这里就不贴地址了。

作者: QQ6170372    时间: 2016-2-23 09:40
用子查询和ado实现效率比较低,目前好像却也没有更好的办法了
作者: roych    时间: 2016-2-23 11:15
本帖最后由 roych 于 2016-2-23 11:17 编辑

1、使用联合查询:
select top 3 字段 from 表
where xx=a
union
select top 3 字段 from 表
where xx=b
…………………………
select top 3 字段 from 表
where xx=n

2、创建一列,更新为序列号,再处理:
数据定义查询:alter 表 add Column 序号 long;
更新查询:Update 表 set 序号=Dcount("字段","表","字段="&[字段]);
选择查询:select * from 表 where 序号<=3;

3、ADO处理。分别创建2个记录集,一个为分组字段,另一个则以分组字段为条件。通过movenext的方法来完成第二个记录集的读取。
rst1.open "select distinct 字段 from 表",currentproject.connection,adOpenKeyset, adLockOptimistic
do until rst1.eof
rst2.open"select * from b "& where 字段='"& rst1(0)&"' order by 某字段",currentproject.connection,adOpenKeyset,adLockOptimistic
for i=1 to 3

xx=rst2(0)
………………
rst2.movenext
next
rsst2.close
rst1.movenext
loop
…………………………
个人推荐使用方法2

作者: QQ6170372    时间: 2016-2-26 12:24
很全面,非常感谢




欢迎光临 Office中国论坛/Access中国论坛 (http://www.office-cn.net/) Powered by Discuz! X3.3