请问SQL中如何GROUP BY 与TOP
时间:2011-12-19
来源:互联网
ID nickname addtime
1 a 2011-12-19 11:11:12
2 b 2011-12-19 11:11:12
1 c 2011-12-19 11:11:10
2 c 2011-12-19 11:11:10
1 a 2011-12-19 11:11:11
2 b 2011-12-19 11:11:11
需求是根据时间倒序,取出每个ID,nickname 的前两条数据。
作者: zsp_1989xiaorui 发布时间: 2011-12-19
; WITH tmp AS ( SELECT * , rn = ROW_NUMBER() OVER ( PARTITION BY id ORDER BY nickname ) FROM tb ) SELECT * FROM tmp WHERE rn <= 2
作者: wufeng4552 发布时间: 2011-12-19
select * from (select no=row_number() over(partition by id order by addtime desc),* from tb)t where no<3
作者: ssp2009 发布时间: 2011-12-19
select distinct b.* from tb a cross apply (select top 2 * from tb where id=a.id order by addtime desc)b
作者: fredrickhu 发布时间: 2011-12-19
select distinct b.* from tb a cross apply(select top 2 * from tb where id=a.id order by addtime desc) b
作者: ssp2009 发布时间: 2011-12-19
if object_id('tb') is not null drop table tb go create table tb ( id int, nickname varchar(10), addtime datetime ) go insert into tb select 1,'a','2011-12-19 11:11:12' union all select 2,'b','2011-12-19 11:11:12' union all select 1,'c','2011-12-19 11:11:10' union all select 2,'c','2011-12-19 11:11:10' union all select 1,'a','2011-12-19 11:11:11' union all select 2,'b','2011-12-19 11:11:11' go select id,nickname,addtime from ( select *,row=row_number() over(partition by id,nickname order by getdate()) from tb ) t where row between 1 and 2 go /* id nickname addtime ----------- ---------- ----------------------- 1 a 2011-12-19 11:11:12.000 1 a 2011-12-19 11:11:11.000 1 c 2011-12-19 11:11:10.000 2 b 2011-12-19 11:11:12.000 2 b 2011-12-19 11:11:11.000 2 c 2011-12-19 11:11:10.000 (6 行受影响) */
作者: pengxuan 发布时间: 2011-12-19
--------------------------------- -- Author: liangCK 小梁 -- Title : 查每个分组前N条记录 -- Date : 2008-11-13 17:19:23 --------------------------------- --> 生成测试数据: #T IF OBJECT_ID('tempdb.dbo.#T') IS NOT NULL DROP TABLE #T CREATE TABLE #T (ID VARCHAR(3),GID INT,Author VARCHAR(29),Title VARCHAR(39),Date DATETIME) INSERT INTO #T SELECT '001',1,'邹建','深入浅出SQLServer2005开发管理与应用实例','2008-05-10' UNION ALL SELECT '002',1,'胡百敬','SQLServer2005性能调校','2008-03-22' UNION ALL SELECT '003',1,'格罗夫Groff.J.R.','SQL完全手册','2009-07-01' UNION ALL SELECT '004',1,'KalenDelaney','SQLServer2005技术内幕存储引擎','2008-08-01' UNION ALL SELECT '005',2,'Alex.Kriegel.Boris.M.Trukhnov','SQL宝典','2007-10-05' UNION ALL SELECT '006',2,'飞思科技产品研发中心','SQLServer2000高级管理与开发','2007-09-10' UNION ALL SELECT '007',2,'胡百敬','SQLServer2005数据库开发详解','2008-06-15' UNION ALL SELECT '008',3,'陈浩奎','SQLServer2000存储过程与XML编程','2005-09-01' UNION ALL SELECT '009',3,'赵松涛','SQLServer2005系统管理实录','2008-10-01' UNION ALL SELECT '010',3,'黄占涛','SQL技术手册','2006-01-01' --SQL查询如下: --按GID分组,查每个分组中Date最新的前2条记录 --1.字段ID唯一时: SELECT * FROM #T AS T WHERE ID IN(SELECT TOP 2 ID FROM #T WHERE GID=T.GID ORDER BY Date DESC) --2.如果ID不唯一时: SELECT * FROM #T AS T WHERE 2>(SELECT COUNT(*) FROM #T WHERE GID=T.GID AND Date>T.Date) --SQL Server 2005 使用新方法 --3.使用ROW_NUMBER()进行排位分组 SELECT ID,GID,Author,Title,Date FROM ( SELECT rid=ROW_NUMBER() OVER(PARTITION BY GID ORDER BY Date DESC),* FROM #T ) AS T WHERE rid<=2 --4.使用APPLY SELECT DISTINCT b.* FROM #T AS a CROSS APPLY ( SELECT TOP(2) * FROM #T WHERE a.GID=GID ORDER BY Date DESC ) AS b --结果 /* ID GID Author Title Date ---- ----------- ----------------------------- --------------------------------------- ----------------------- 003 1 格罗夫Groff.J.R. SQL完全手册 2009-07-01 00:00:00.000 004 1 KalenDelaney SQLServer2005技术内幕存储引擎 2008-08-01 00:00:00.000 005 2 Alex.Kriegel.Boris.M.Trukhnov SQL宝典 2007-10-05 00:00:00.000 007 2 胡百敬 SQLServer2005数据库开发详解 2008-06-15 00:00:00.000 009 3 赵松涛 SQLServer2005系统管理实录 2008-10-01 00:00:00.000 010 3 黄占涛 SQL技术手册 2006-01-01 00:00:00.000 (6 行受影响) */
作者: fredrickhu 发布时间: 2011-12-19
distinct b.*
from
tb a
cross apply
(select top 2 * from tb where id=a.id order by addtime desc)b
作者: TravyLee 发布时间: 2011-12-19
作者: wufeng4552 发布时间: 2011-12-19
--应该按倒序排 if object_id('tb') is not null drop table tb go create table tb ( id int, nickname varchar(10), addtime datetime ) go insert into tb select 1,'a','2011-12-19 11:11:12' union all select 2,'b','2011-12-19 11:11:12' union all select 1,'c','2011-12-19 11:11:10' union all select 2,'c','2011-12-19 11:11:10' union all select 1,'a','2011-12-19 11:11:11' union all select 2,'b','2011-12-19 11:11:11' go select id,nickname,addtime from ( select *,row=row_number() over(partition by id,nickname order by addtime desc) from tb ) t where row between 1 and 2 go /* id nickname addtime ----------- ---------- ----------------------- 1 a 2011-12-19 11:11:12.000 1 a 2011-12-19 11:11:11.000 1 c 2011-12-19 11:11:10.000 2 b 2011-12-19 11:11:12.000 2 b 2011-12-19 11:11:11.000 2 c 2011-12-19 11:11:10.000 (6 行受影响) */
作者: pengxuan 发布时间: 2011-12-19
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28