sql返回前N行
Posted 小破天
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sql返回前N行相关的知识,希望对你有一定的参考价值。
场景:返回每个客户最近的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行的主要内容,如果未能解决你的问题,请参考以下文章
sql [SQL查询片段]用于在命令行或通过R和其他工具使用SQL的快速代码段#tags:sql,R,text processing,命令li