zoukankan      html  css  js  c++  java
  • 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索引才能运行良好

  • 相关阅读:
    Linux之安装python3.6.6
    Python之计算器
    springboot项目快速代码生成工具
    电脑忘记密码怎么办?
    HTML编辑器
    WCF的几种寄宿方式
    获取客户端IP 和 外网IP
    发送短信验证码
    动态库,服务tips
    asp.net WebService 与 WCF的区别
  • 原文地址:https://www.cnblogs.com/xiaopotian/p/6840432.html
Copyright © 2011-2022 走看看