zoukankan      html  css  js  c++  java
  • T-SQL基础(2)

    开窗函数over

    select orderid, custid, val,
    SUM(val) over() as totalvalue,
    SUM(val) over(partition by custid) as custtotalvalue
    from Sales.OrderValues
    
    select orderid, custid, val,
    100. * val / SUM(val) over() as pctall,
    100. * val / SUM(val) over(partition by custid) as pctcust
    from Sales.OrderValues

    over 子句也支持四种排名函数:row_number, rank, dense_rank and ntile

    select orderid, custid, val,
      row_number() over(order by val) as rownum,
      rank() over(order by val) as rank,
      dense_rank() over(order by val) as dense_rank,
      ntile(10) over(order by val) as ntile --分为10组,显示当前行所在的组号
    from Sales.OrderValues
    order by val;
    
    select orderid, custid, val,
    row_number() over(partition by custid order by val) as rownum
    from Sales.OrderValues
    order by custid, val;

    如果在select处理阶段指定了开窗函数,开窗函数必须在distinct子句(如果存在)之前进行处理。
    OrderValues视图目前有830行,795个不同的val值。

    select distinct val, ROW_NUMBER() over(order by val) as rownum
    from Sales.OrderValues
    --返回830 rows
    
    select distinct val from Sales.OrderValues
    --返回795 rows

    可以认为在同一select子句中不同时指定distinct和row_number是一条最佳实践原则,因为distinct子句在这种情况下不起任何作用。可以使用group by为795个唯一值分配行号。

    select val, ROW_NUMBER() over(order by val) as rownum
    from Sales.OrderValues group by val;

    select 各子句处理顺序

    from
    where
    group by
    having
    select
      over 
      distinct
      top
    order by
  • 相关阅读:
    LOJ#10106. 「一本通 3.7 例 2」单词游戏
    小木棍(爆搜减枝)
    倍增求lca(模板)
    2018年第九届蓝桥杯C/C++A组省赛(最后一题)
    LOJ#10172. 「一本通 5.4 练习 1」涂抹果酱
    【[APIO/CTSC2007]动物园】状压DP
    c++滚动数组
    状态压缩入门(附经典题目和题解)
    小 M 的算式(dfs)
    P与NP问题详解
  • 原文地址:https://www.cnblogs.com/thlzhf/p/3407492.html
Copyright © 2011-2022 走看看