日期:2014-05-18  浏览次数:20550 次

求每分组取前3条纪录的sql语句
我的表中数据如下:
名称 分类ID
甲1           1
乙1 2
丙1 3
丁1 4
戊1 5
己1 6
甲2           1
乙2 2
丙2 3
丁2 4
戊2 5
己2 6
甲3           1
乙3 2
丙3 3
丁3 4
戊3 5
己3 6
甲4           1
乙4 2
丙4 3
丁4 4
戊4 5
己4 6
甲5           1
乙5 2
丙5 3
丁5 4
戊5 5
己5 6
甲6           1
乙6 2
丙6 3
丁6 4
戊6 5
己6 6

求按分类ID分组,每组取前三条的Sql语句

要求不使用游标,也不要用那种很耗资源(执行很慢的Sql语句,例如相关子查询)

------解决方案--------------------
分类取前N个记录的SQL语句

有一个表AAA,结构如下:
类别编号 说明 排序
a aa 1
a aa2 2
a aa3 3
b bb 1
b bb2 2
b bb3 3
c cc 1
c cc2 2
c cc3 3
需要查询出来的结果是每个类别的头2条记录,按排序进行排序,结果如下:
类别编号 说明 排序
a aa 1
a aa2 2
b bb 1
b bb2 2
c cc 1
c cc2 2
谢谢各位了!只要测试通过马上给分!


if object_id( 'pubs..t1 ') is not null
drop table t1
go

create table t1(
类别编号 varchar(10),
说明 varchar(10),
排序 int
)
insert into t1(类别编号,说明,排序) values( 'a ', 'aa ',1)
insert into t1(类别编号,说明,排序) values( 'a ', 'aa2 ',2)
insert into t1(类别编号,说明,排序) values( 'a ', 'aa3 ',3)
insert into t1(类别编号,说明,排序) values( 'b ', 'bb ',1)
insert into t1(类别编号,说明,排序) values( 'b ', 'bb2 ',2)
insert into t1(类别编号,说明,排序) values( 'b ', 'bb3 ',3)
insert into t1(类别编号,说明,排序) values( 'c ', 'cc ',1)
insert into t1(类别编号,说明,排序) values( 'c ', 'cc2 ',2)
insert into t1(类别编号,说明,排序) values( 'c ', 'cc3 ',3)

select * from t1 as t
where (select count(*) from t1 where 类别编号 = t.类别编号 and 排序 < t.排序) < 2

drop table t1


类别编号 说明 排序
---------- ---------- -----------
a aa 1
a aa2 2
b bb 1
b bb2 2
c cc 1
c cc2 2

(所影响的行数为 6 行)
------解决方案--------------------
如果分类固定而且已知,当然可以执行6次语句就可以(这样效率高而且简单)
select top 3 * from tablename where 分类ID=1
select top 3 * from tablename where 分类ID=2
...


游标有很多种类型,类型选择不合理的时候确实容易有并发问题,但是在采用只读游标的时候应该也没有并发问题

问题是你这个应用想不出需要使用游标的理由