分组查找前几条数据

本文涉及的产品
云数据库 RDS SQL Server,独享型 2核4GB
简介:
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
分类:  SqlServer

本文转自快乐就好博客园博客,原文链接:http://www.cnblogs.com/happyday56/archive/2009/09/11/1564769.html,如需转载请自行联系原作者
相关实践学习
使用SQL语句管理索引
本次实验主要介绍如何在RDS-SQLServer数据库中,使用SQL语句管理索引。
SQL Server on Linux入门教程
SQL Server数据库一直只提供Windows下的版本。2016年微软宣布推出可运行在Linux系统下的SQL Server数据库,该版本目前还是早期预览版本。本课程主要介绍SQLServer On Linux的基本知识。 相关的阿里云产品:云数据库RDS&nbsp;SQL Server版 RDS SQL Server不仅拥有高可用架构和任意时间点的数据恢复功能,强力支撑各种企业应用,同时也包含了微软的License费用,减少额外支出。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/sqlserver
相关文章
|
2月前
|
算法 前端开发
在系统中查找重复文件
在系统中查找重复文件
26 0
|
12天前
|
存储 关系型数据库 索引
10. 在一个非主键字段上创建了索引, 想要根据该字段查询到数据, 需要查询几次 ?
在非主键字段上创建索引,查询数据通常需两次。对于MyISAM,先通过索引找到数据行指针,再获取数据;而InnoDB则先找主键ID,再从主键索引中查找数据。
11 0
|
26天前
|
关系型数据库 MySQL 开发工具
MySQL分组后,组内排序,然后取每组的第一条数据
MySQL分组后,组内排序,然后取每组的第一条数据
15 1
|
SQL 关系型数据库 MySQL
MySQL 多表分组后获取每一组的时间最大的那条记录
MySQL 多表分组后获取每一组的时间最大的那条记录
401 0
|
数据库 索引
存在逻辑删除的表字段上建立唯一索引的巧办法 (逻辑删除与唯一索引)
设计数据库唯一索引时,经常会碰到唯一删除的键值,导致很难处理,这里就简单介绍一种巧办法,帮你快速解决该问题
1734 0
存在逻辑删除的表字段上建立唯一索引的巧办法 (逻辑删除与唯一索引)
|
存储 小程序
小程序实现搜索历史记录,去重搜索字段以及限制展示字段数量
小程序实现搜索历史记录,去重搜索字段以及限制展示字段数量
1347 0
|
SQL
sql 分组后按时间降序排列再取出每组的第一条记录
原文:sql 分组后按时间降序排列再取出每组的第一条记录 竞价记录表: Aid 为竞拍车辆ID,uid为参与竞价人员ID,BidTime为参与竞拍时间 查询出表中某人参与的所有车辆的最新的一条的竞价记录 ...
3020 0