分组查找前几条数据

本文介绍了一种在 SQLServer 中按分组获取最新日期记录的方法。通过四种不同的 SQL 查询方式,实现了从数据库中选取特定分组下最新日期的前两条记录,包括使用 ID 唯一标识符、ID 非唯一、ROW_NUMBER() 排位函数以及 APPLY 子句等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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,如需转载请自行联系原作者
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值