SQL 找出一个表中各个分类的前三条记录

本文介绍了两种不同的SQL查询方法,一种适用于SQL2000,另一种适用于SQL2005及以上版本。通过具体示例展示了如何从数据库中高效地选择每个类别下的前三条记录,并对比了不同查询方法的执行效率。

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

SQL2000的写法一:


select  QuestionId,CategoryId,Title   from  QA_Questions a  where  
a.QuestionId
<=
(
select   max (c.QuestionId)  from  
(
select   top   3   QuestionId   from  QA_Questions b  where  b.CategoryId = a.CategoryId) c)
order   by  CategoryId


SQL2000的写法二:
select  a.questionid,a.categoryid
from  dbo.QA_Questions a
where  Questionid  in  ( select   top   3  Questionid  from  QA_Questions  where  categoryid = a.categoryid 
order   by  Questionid  desc ) order   by  a.categoryid  asc



SQL2005的写法:

WITH  NewTable  AS (
SELECT   * ,RANK()  OVER (PARTITION  BY   CategoryId  Order   BY   QuestionId) RANK
 
FROM   QA_Questions)
SELECT   *   FROM  NewTable
WHERE  RANK  <   4


-- -以下是时间测试,结果为189:266

declare   @t   datetime  ; set   @t = getdate ()
select   *   from  QA_Questions a  where  
a.QuestionId
<=
(
select   max (c.QuestionId)  from  
(
select   top   3   QuestionId   from  QA_Questions b  where  b.CategoryId = a.CategoryId) c)
order   by  CategoryId

select   DateDiff ( ms, @t , getdate ()); set   @t = getdate ()
begin
    
WITH  NewTable  AS (
    
SELECT   * ,RANK()  OVER (PARTITION  BY   CategoryId  Order   BY   QuestionId) RANK
     
FROM   QA_Questions)
    
SELECT   *   FROM  NewTable
    
WHERE  RANK  <   4
end

select   DateDiff ( ms, @t , getdate ()); set   @t = getdate ()

select  a.questionid,a.categoryid
from  dbo.QA_Questions a
where  Questionid  in  ( select   top   3  Questionid  from  QA_Questions  where  categoryid = a.categoryid 
order   by  Questionid  desc ) order   by  a.categoryid  asc

select   DateDiff ( ms, @t , getdate ())
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值