1. 程式人生 > >sql返回前N行

sql返回前N行

nbsp rdate 不同 des emp top image style col

場景:返回每個客戶最近的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行