开窗函数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
posted on 2013-11-04 21:49  逝者如斯(乎)  阅读(207)  评论(0编辑  收藏  举报