开窗函数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