分组排序,取每组前五条记录

xiangbin77 2008-01-16 02:54:38

--对表进行分组查询,在组内就进行排序,并且取得每组前5条记录. 还要获得每组使用其它条件查询时候的总记录数
--如:
--字段Key为int型.
select * from TableName where Word='FQ' and UserName='张三' group by Key order by ID desc
UNION ALL
select * from TableName where Word='FQ' and UserName='李四' group by Key order by ID desc
UNION ALL
select * from TableName where Word='FQ' and UserName='王五' group by Key order by ID desc
--这里只是分组了,我还要获得每组(条件Word='FQ')的记录总数
select count(ID) from TableName where Word='FQ'

---------------------------------------------------------
--上面的SQL是我的个人试想,实际运行是报错的.
-- 最后返回记录集.组程序中DataSet
----------------------------------------------------------
...全文
773 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
dobear_0922 2008-01-16
  • 打赏
  • 举报
回复
select m.*,n.cnt 
from
(
select * from tb t where id in (select top 5 id from tb where Word='FQ' and [key] = t.[key] order by id)
) m join
(
select [key] , cnt = count(ID) from tb where Word='FQ' group by [key]
) n on m.[key] = n.[key]
pt1314917 2008-01-16
  • 打赏
  • 举报
回复

-------分组前5条记录
select * from TableName a where Word='FQ' and id in(select top 5 id from TableName where Word='FQ' and UserName=a.UserName order by id desc)

---每组记录总数
select UserName,count(1)[总数] from TableName where Word='FQ' group by UserName
xiangbin77 2008-01-16
  • 打赏
  • 举报
回复
好像我写得还是不够明白..我重新开一个贴吧....这里回复了的我都给加,谢谢各位.
dawugui 2008-01-16
  • 打赏
  • 举报
回复
select m.*,n.cnt from 
(
select * from tb t where id in (select top 5 id from tb where Word='FQ' and [key] = t.[key] order by id)
) m,
(
select [key] , cnt = count(ID) from tb where Word='FQ' group by [key]
) n
where m.[key] = n.[key]
chengg0769 2008-01-16
  • 打赏
  • 举报
回复
先把这些分组数据插入到一个#temp的临时表,再count()
--#temp
select GID=0,* into #temp
from TableName
where 1=2

--insert group data
insert into #temp
select 1,* from TableName where Word='FQ' and UserName='张三' group by Key order by ID desc
UNION ALL
select 2,* from TableName where Word='FQ' and UserName='李四' group by Key order by ID desc
UNION ALL
select 3,* from TableName where Word='FQ' and UserName='王五' group by Key order by ID desc

--count
select GID,count(ID) from #temp where Word='FQ' group by GID


=====================================================
powerbuilder11&SQL QQ群请加:6539042
xiangbin77 2008-01-16
  • 打赏
  • 举报
回复
我是用的sql server 2000
dawugui 2008-01-16
  • 打赏
  • 举报
回复
关键是这个不太明白:
还要获得每组使用其它条件查询时候的总记录数
xiangbin77 2008-01-16
  • 打赏
  • 举报
回复
Key是字段名,不是关键词..可以把Key改成KeysID
jinjazz 2008-01-16
  • 打赏
  • 举报
回复
如果是sql2005可以用 row_number() over(order by xxx)
dawugui 2008-01-16
  • 打赏
  • 举报
回复
select * from tb t
where id in
(
select top 5 id from tb where key = t.key order by id
)
free1879 2008-01-16
  • 打赏
  • 举报
回复
group by Key?你要干什么?
-狙击手- 2008-01-16
  • 打赏
  • 举报
回复
select a.UserName
from TableName a
join TableName b
on a.UserName = b.UserName
where a.Word='FQ'
group by a.UserName
having count(case when a.id<= b.idthen 1 else null end) < = 5 --可动态修改
order by a.UserName
-狙击手- 2008-01-16
  • 打赏
  • 举报
回复
--测试环境
create table student --学生列表
(
s_id int,
s_name char(10)
)
create table class --课程列表
(
c_id int,
c_name char(10)
)

create table grade --学生成绩表
(
s_id int,
c_id int,
cj int
)

--测试数据
insert student values(1,'A')
insert student values(2,'B')
insert student values(3,'C')
insert student values(4,'D')
insert student values(5,'E')

insert class values(1,'历史')
insert class values(2,'数学')

insert grade values(1,1,60)
insert grade values(2,1,70)
insert grade values(3,1,80)
insert grade values(4,1,90)
insert grade values(5,1,100)
insert grade values(1,2,85)
insert grade values(2,2,67)
insert grade values(3,2,94)
insert grade values(4,2,63)
insert grade values(5,2,87)


select a.c_id,a.s_id,a.cj from grade a
join grade b
on a.c_id = b.c_id
group by a.c_id,a.s_id,a.cj
having count(case when a.cj <= b.cj then 1 else null end) < = 5 --可动态修改
order by a.c_id,a.cj desc


--处理重复分数
select a.c_id,a.s_id,a.cj
from grade a join
(
select c_id,cj
from grade
group by c_id,cj
) b
on a.c_id = b.c_id
group by a.c_id,a.s_id,a.cj
having count(case when a.cj <= b.cj then 1 else null end) < = 5 --可动态修改
order by a.c_id,a.cj desc

--你可以以动态的修改: n <= n 来获得
--每门课程的前n个最高分的


declare @ta table(n1 float,n2 float)
insert @ta values(2,3)
insert @ta values(8,5)
insert @ta values(8,5)
insert @ta values(9,3)
insert @ta values(3,1)
insert @ta values(10,4)

select n1,n2,cast((n2-n1)*100/n1 as decimal(10,2)) [(n2-n1)*100/n1] ,identity(int,1,1) id
into #temp
from @ta

select a.n1,a.n2,a.[(n2-n1)*100/n1],
count(case when a.[(n2-n1)*100/n1] <= b.[(n2-n1)*100/n1]
then 1 else null end) 名次
from #temp a cross join
(
select [(n2-n1)*100/n1]
from #temp
group by [(n2-n1)*100/n1]
) b
group by a.n1,a.n2,a.[(n2-n1)*100/n1],a.id
order by 名次

drop table #temp

n1 n2 (n2-n1)*100/n1 名次
------ ----- -------------- --------
2.0 3.0 50.00 1
8.0 5.0 -37.50 2
8.0 5.0 -37.50 2
10.0 4.0 -60.00 3
9.0 3.0 -66.67 4
3.0 1.0 -66.67 4

(所影响的行数为 6 行)
内容概要:本文系统梳理了多个科研领域的沿研究与技术实现,重点涵盖FDTD方法中的完美匹配层(PML)研究,以及Matlab/Simulink在电磁、电力、控制、通信、信号处理、图像处理、路径规划、能源系统优化等领域的仿真与算法实现。文中列举了大量基于Matlab和Python的科研案例,如风电功率预测、负荷预测、无人机三维路径规划、电池系统故障诊断、雷达模拟、通信编码、微电网优化调度等,并强调结合智能优化算法(如粒子群、遗传算法、深度学习等)提升系统性能。同时,提供了丰富的代码资源与仿真模型,涵盖永磁同步电机控制、逆变器设计、多智能体任务分配、虚拟电厂调度等复杂系统,助力科研人员快速开展复现实验与创新研究。; 适合人群:具备一定编程基础,熟悉Matlab/Python工具,从事电气工程、自动化、通信、人工智能、新能源、控制科学等相关领域研究的研发人员及研究生。; 使用场景及目标:① 学习并实现FDTD仿真中的PML边界条件以有效抑制数值反射;② 掌握Matlab/Simulink在多物理场建模、控制系统设计与优化算法中的综合应用;③ 借助提供的代码资源完成科研复现、课程设计、竞赛项目或工程原型开发; 阅读建议:此资源以科研实战为导向,不仅提供理论方法,更强调代码实现与仿真验证。建议读者结合自身研究方向,按目录顺序查阅相关模块,下载配套代码进行调试与二次开发,以达到学以致用、融会贯通的目的。

22,297

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧