sql返回前N行
阿新 • • 發佈:2017-05-12
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 bycustid 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 fromSales.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行