SQL Server 获取每组中的前N个

转载 2015年07月11日 09:25:23

方法一:

--建立测试环境 
create table ta3(id varchar(4),repairvalue numeric(4,2),pieceid varchar(2),facid varchar(8)) 
insert into ta3 
select '01',4.6,'1','aaa' 
union all select '02',2,'1','aaa' 
union all select '03',0,'1','aaa' 
union all select '04',3,'1','aaa' 
union all select '05',5,'1','aaa' 
union all select '06',4.6,'2','aaa' 
union all select '07',7.8,'2','aaa' 
union all select '08',0,'2','aaa' 
union all select '09',5,'2','aaa' 
union all select '10',3,'2','aaa' 
--测试 
Select id,repairvalue,pieceid from ta3 A 
Where Not Exists(Select 1 from ta3 Where pieceid=A.pieceid And repairvalue>A.repairvalue Having Count(1)>2) --这里N取3
Order By pieceid,repairvalue Desc 
--删除测试环境 
Drop Table ta3 
--结果 
/* 
id repairvalue pieceid 
05 5.00 1 
01 4.60 1 
04 3.00 1 
07 7.80 2 
09 5.00 2 
06 4.60 2 
*/ 

方法二:




if object_id('tb') is not null
   drop table tb
go


create table tb
([id] int, [title] numeric(12,1), [typeid] int, [datetime] int)


insert into tb
select 1,1.1,1,1
union all select 2,1.2,1,2
union all select 3,1.3,1,3
union all select 4,2.1,2,4
union all select 5,2.2,2,5
union all select 6,2.3,2,6
union all select 7,3.1,3,7
union all select 8,3.2,3,8
union all select 9,3.3,3,9


select *
from
(
select *,
       
       --先按typeid分组,在一组中按照datetime降序排列,来编号
       ROW_NUMBER() over(partition by typeid 
                             order by datetime desc)  as rownum
from tb
)t
where rownum<=2  --取行号为1和2的,也就是时间最大的2条数据


/*
id<span style="white-space:pre">	</span>title<span style="white-space:pre">	</span>typeid<span style="white-space:pre">	</span>datetime<span style="white-space:pre">	</span>rownum
3<span style="white-space:pre">	</span>1.3<span style="white-space:pre">	</span>1<span style="white-space:pre">	</span>3<span style="white-space:pre">	</span>1
2<span style="white-space:pre">	</span>1.2<span style="white-space:pre">	</span>1<span style="white-space:pre">	</span>2<span style="white-space:pre">	</span>2
6<span style="white-space:pre">	</span>2.3<span style="white-space:pre">	</span>2<span style="white-space:pre">	</span>6<span style="white-space:pre">	</span>1
5<span style="white-space:pre">	</span>2.2<span style="white-space:pre">	</span>2<span style="white-space:pre">	</span>5<span style="white-space:pre">	</span>2
9<span style="white-space:pre">	</span>3.3<span style="white-space:pre">	</span>3<span style="white-space:pre">	</span>9<span style="white-space:pre">	</span>1
8<span style="white-space:pre">	</span>3.2<span style="white-space:pre">	</span>3<span style="white-space:pre">	</span>8<span style="white-space:pre">	</span>2
*/


相关文章推荐

sql server如何求前N列的和(具体几列未知) 右侧汇总

sql server如何求前N列的和(具体几列未知) 右侧汇总 首先创建数据,以小区收费为例: select identity(int,1,1) as ID,tb.* into #Test f...

sql server 存入中文前加N

加上 N 代表存入数据库时以 Unicode 格式存储。 N’string’ 表示string是个Unicode字符串Unicode 字符串的格式与普通字符串相似, 但它前面有一个 N 标识符(N...

Postgresql查询每组的前N条记录

表结构如下, [sql] view plaincopy                Table "ytt.t1"    Column |      ...

Oracle分组查询取每组排序后的前N条记录

项目中用到Oracle分组查询取每组排序后的前N条记录,group by 只能返回每个组的单条统计。所以用OVER(PARTITION BY)函数,具体详见baidu.com 建个测试表test_ab...

[mysql] 先按某字段分组再取每组中前N条记录

From: http://blog.chinaunix.net/uid-26729093-id-4294287.html 请参考:http://bbs.csdn.net/topics/3300212...

读入一个c程序,并按字母表顺序分组打印变量名,每组前N个字符相同(TCPL 练习6-2)

在建立结构tnode的过程中,我们没有预设门槛。这道题目就设置了门槛,必须根据前N个字符来进行分组,于是排除了长度小于N的变量,以便减轻负担。 因为要求对变量名分组打印,组别理所应当地应该按照至少是...

SQL分组取每组前一(或几)条记录(排名)

mysql分组取每组前几条记录(排名) 附group by与order by的研究 http://www.jb51.net/article/31590.htm   --按某一字段分组取最大(小)...
  • hefw1
  • hefw1
  • 2016年07月20日 08:39
  • 314

在 VMWare 中配置 SQL Server 2005 N + 1 群集 (一) 环境

在 VMWare 中配置 SQL Server 2005 N + 1 群集 (一) 环境2008-07-09 09:14:00|  分类: 默认分类 阅读52 评论0  字号:大中小 订阅1.    ...

在 VMWare 中配置 SQL Server 2005 N + 1 群集 (三) 群集安装

在 VMWare 中配置 SQL Server 2005 N + 1 群集 (三) 群集安装2008-07-09 09:19:57|  分类: 默认分类 阅读95 评论0  字号:大中小 订阅3.  ...

SQL Server之路必读的N本书(不定期持续更新)(ZZ)

ID Name ISBN 1 SQL应用重构 9787111263586 2 SQL 必知必会(第3版) ...
  • is2120
  • is2120
  • 2012年05月03日 17:50
  • 1782
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:SQL Server 获取每组中的前N个
举报原因:
原因补充:

(最多只允许输入30个字)