FIRST_VALUE和LAST_VALUE函数分别允许从窗口框架的第一行和最后一行返回一个元素。因此,这些函数支持窗口分区、排序和框架子句。
如果希望元素来自窗口分区的第一行,应使用带有窗口框架范围“ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW”的FIRST_VALUE。由于该框架是默认的,故而也可以省略。
如果希望元素来自窗口分区的最后一行,应使用带有窗口框架范围“ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING”的LAST_VALUE。需要注意的是,该框架不能省略,因为在未指定该框架的情况下会使用默认框架“ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW”,这样会导致最后一行就是当前行,,即CURRENT ROW,所以即使使用了LAST_VALUE函数,也不会得到窗口的最后一行。
下面通过一个示例来说明这两个函数的使用方法。下面的查询使用FIRST_VALUE函数返回雇员当年第一个季度的销售额,使用LAST_VALUE函数返回当年最后一个季度的销售额。查询结果如表9-20所示。
SELECT EmpID, SalesYear, SalesQuarter,
FIRST_VALUE(SubTotal) OVER(PARTITION BY EmpID, SalesYear
ORDER BY EmpID,SalesYear, SalesQuarter
ROWS BETWEEN UNBOUNDEDPRECEDING
AND CURRENT ROW) AS FirstVal,
SubTotalAS CurVal,
LAST_VALUE(SubTotal) OVER(PARTITION BY EmpID, SalesYear
ORDER BY EmpID,SalesYear, SalesQuarter
ROWS BETWEEN CURRENT ROW
AND UNBOUNDED FOLLOWING) AS LastVal
FROM dbo.Orders
ORDER BY EmpID, SalesYear, SalesQuarter;
其实你已经错过了旅行的意义。