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

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 ())
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值