`

一条sql取出每个分类的前两条记录

 
阅读更多
写道
--> 生成测试数据: #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 行受影响)

 以上内容引自互联网,

下面简要说明下在什么情况下会遇到此种情景,

比如有这样一种需求:

某一父类有很多的子类,每一子类又对应多条内容,此时我们需要获取包含该父类下所有子类的内容,且规定每个子类限取两条,则可以使用以上方法,具体使用情况可根据以上方式区别对待。

 

分享到:
评论

相关推荐

    sql_按照某一个字段进行去重后获取全部字段

    假设我们需要从 `person_real_time_bill` 表中找出所有金额小于零的账单,并且对于同一个 `serial_number`,只保留最新的一条记录。此时,上面的 SQL 语句就能很好地满足需求。 ### 总结 通过以上分析,我们不仅...

    SQL入门与高级使用篇

    每个记录由多个字段组成,例如,Name 和 Email Address。 5. SQL 语句 使用 SELECT 语句可以从表中取出数据。例如,使用 SELECT 语句可以从表中取出所有记录,也可以根据条件来取出记录。 6. 创建新表 使用 ...

    mysql分组取每组前几条记录(排名) 附group by与order by的研究

    –按某一字段分组取最大(小)值所在行的数据 代码如下: /* 数据如下: nameval memo a 2 a2(a的第二个值) a 1 a1–a的第一个值 a 3 a3:a的第三个值 b 1 b1–b的第一个值 b 3 b3:b的第三个值 b 2 b2b2b2b2 b 4 b4b4 b ...

    C# 在sql server数据时间段内,间隔时间查询数据方法

    在sql server 数据库中,在一段时间范围内,间隔几条数据取出一条信息的检索方法。如:时间段内“2020-10-10 00:00:00” 到“2020-10-11 00:00:00”内,间隔30秒取出一套数据方法

    sql经典笔试题二(含答案)

    4. 通过外联接,取出每个学生的Name、Class、Score: ```sql SELECT T1.Name, T2.Class, T2.Score FROM TableX T1 LEFT JOIN TableY T2 ON T1.Code = T2.Code; ``` 这个查询使用左外联接确保即使在`TableY`中没有...

    sqlserver试题含答案.doc

    1.2 写出一条Sql语句:取出表A中第31到第40记录(SQL Server,以自动增长的ID作为主键,注意:ID可能不是连续的)。 答:解法1:select top 10 * from A where id not in (select top 30 id from A) 解法2:select...

    SQL语法大全中文版借鉴.pdf

    一行中的数据组合在一起称为一条记录。 SQL 的应用 SQL 语言可以用于各种应用场景,如: * 创建新表 * 添加和删除记录 * 修改表的结构 * 查询和取出记录 * 建立交互站点 SQL 的优点 使用 SQL 语言可以提高...

    经典SQL语句大全

    13、说明:一条sql 语句搞定数据库分页 select top 10 b.* from (select top 20 主键字段,排序字段 from 表名 order by 排序字段 desc) a,表名 b where b.主键字段 = a.主键字段 order by a.排序字段 具体实现: ...

    SQL性能优化

     以上两个SQL中dy_dj(电压等级)及xh_bz(销户标志)两个字段都没进行索引,所以执行的时候都是全表扫描,第一条SQL的dy_dj = '1KV以下'条件在记录集内比率为99%,而xh_bz=1的比率只为0.5%,在进行第一条SQL的...

    SQL常用经典语句

    一条SQL语句搞定数据库分页 **场景描述:** 在处理大量数据时,分页是非常常见的需求。 **实现方式:** ```sql SELECT TOP 数量 * FROM (SELECT TOP 分页数量 主键字段, 排序字段 FROM 表名 ORDER BY 排序字段 ...

    LINQ to SQL语句(9)之Top 和Bottom和Paging和SqlMethods

    这里,`Skip(startIndex)`跳过了前两页(60条记录),`Take(pageSize)`则取出了当前页的20条记录。 最后,我们来看一下`SqlMethods`。这是LINQ to SQL提供的一组与SQL函数对应的方法,可以方便地在C#代码中执行类似...

    SQL高级用法

    **示例:** 从两个表中汇总不同部门每个月的业绩。 ```sql SELECT b.dname AS 部门名称, SUM(CASE WHEN a.mon = 1 THEN a.yj ELSE 0 END) AS 一月份, SUM(CASE WHEN a.mon = 2 THEN a.yj ELSE 0 END) AS 二月份, ...

    WINCC+SQLServer实现配方管理

    为了实现配方数据的下载,文档提到需要为每条生产线建立一个配方数据块,并将其中的变量上传到WINCC。此外,还需要建立一个公共的配方数据块(如DB3),该数据块的内容与每条生产线的配方数据块完全相同,用于暂时...

    性能优化与SQL审计高效SQL语句编写.pdf

    由于大部分数据库问题和性能瓶颈都与SQL有关,因此掌握如何编写高效SQL是每个DBA和开发人员的必备技能。 首先,针对描述中提到的场景,我们需要从一张表(T_ORG)中取出数据并插入到另一张表(T_TAR)中,同时还要...

    PL/SQL Developer8.04官网程序_keygen_汉化

     问题:假设有一张表t1,有f1和f2两个字段,f1为number类型,f2为varchar2类型,要往t1里写两条记录,内容自定。  Create or replace procedure test_procedure as V_f11 number :=1;  /*声明变量并赋初值*/  V_...

    PL/SQL 基础.doc

    field1 type [NOT NULL][:=expr1], /*每个等价的成员间用逗号分隔*/ field2 type [NOT NULL][:=expr2], /*如果一个字段限定NOT NULL,那么它必须拥有一个初始值*/ ... /*所有没有初始化的字段都会初始为NULL*/ ...

    SQL2005 触发器

    接下来,触发器检查 `Deleted` 表中是否有记录,如果有,则从 `Deleted` 表中取出第一条记录的各个关联ID,并用这些ID去删除相关联的记录。这样做的目的是确保当删除一个角色时,与其相关的所有资源(如RoleMorpher...

    SQL精典试题 非常不错的

    3. 检索出test_a表中每个id范围内年龄最大的前两名的人员的所有信息: ```sql WITH MaxAgeRank AS ( SELECT *, RANK() OVER (PARTITION BY ID ORDER BY YAGE DESC) AS AgeRank FROM TEST_A ) SELECT * FROM ...

    SQL最全基础教程(有本事别看啊!).docx

    SQL 语句后面的分号是标准方法,用于分隔每条 SQL 语句,以便在服务器的相同请求中执行一条以上的语句。SQL 语言可以分为两个部分:数据操作语言(DML)和数据库定义语言(DDL)。DML 部分包括 select、update、...

Global site tag (gtag.js) - Google Analytics