码迷,mamicode.com
首页 > 数据库 > 详细

sql返回前N行

时间:2017-05-12 18:53:04      阅读:253      评论:0      收藏:0      [点我收藏+]

标签:fse   sql   sel   索引   调用   number   etc   weight   rom   

场景:返回每个客户最近的3个订单。

假设我们已经有一个POC索引(详情见http://www.cnblogs.com/xiaopotian/p/6821502.html),有两种策略来完成该任务:一种是使用ROW_NUMBER函数;另一种使用APPLY运算符和OFFSET/FETCH或TOP,哪一种策略更有效由分区列(custid)的密度来决定。低密度——意味着有大量不同的客户,每个客户订单都很小——基于ROW_NUMBER函数的解决方案是最佳的。

with C as
(
select custid,orderdate,orderid,empid,
  ROW_NUMBER() over(partition by custid order by orderdate desc,orderid desc) as rownum
from Sales.Orders
)

select * from C where rownum<=3 order by custid,rownum

技术分享

当分区列具有高密度时——少量不同的客户,每一个客户都有大量的订单,采用APPLY运算符为每个客户调用带OFFSET/FETCH或TOP的查询

select C.custid,A.* 
from Sales.Customers as C
cross apply(select orderdate,orderid,empid from Sales.Orders as O where O.custid=C.custid order by orderdate desc,orderid desc 
            OFFSET 0 rows FETCH FIRST 3 ROWS ONLY) as A

以上这两种策略都需要一个POC索引才能运行良好

 

sql返回前N行

标签:fse   sql   sel   索引   调用   number   etc   weight   rom   

原文地址:http://www.cnblogs.com/xiaopotian/p/6840432.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!