LAST_VALUE (Transact-SQL)

Возвращает последнее значение из упорядоченного набора значений в SQL Server 2012.

Значок ссылки на раздел Синтаксические обозначения в Transact-SQL

Синтаксис

LAST_VALUE ( [scalar_expression ) 
    OVER ( [ partition_by_clause ] order_by_clause rows_range_clause )

Аргументы

  • scalar_expression
    Это возвращаемое значение. scalar_expression может быть столбцом, вложенным запросом или другим выражением, результатом вычисления которого является одно значение. Другие аналитические функции использовать нельзя.

  • OVER ( [ partition_by_clause ] order_by_clause [ rows_range_clause ] )
    partition_by_clause делит результирующий набор, полученный с помощью предложения FROM, на секции, к которым применяется функция. Если этот параметр не указан, функция обрабатывает все строки результирующего набора запроса как отдельные группы.

    order_by_clause определяет порядок данных перед применением функции. order_by_clause — это обязательный параметр. rows_range_clause еще больше ограничивает строки в пределах секции, указав начальную и конечную точки. Дополнительные сведения см. в разделе Предложение OVER (Transact-SQL).

Возвращаемые типы данных

Тот же тип, что и scalar_expression.

Примеры

А. Использование LAST_VALUE для секций

В следующем примере показано возвращение даты найма последнего сотрудника каждого отдела для указанной заработной платы (Rate). Предложение PARTITION BY разделяет сотрудников по отделам, а функция LAST_VALUE применяется к каждой секции в отдельности. Предложение ORDER BY, указанное в предложении OVER, определяет логический порядок, в котором функция LAST_VALUE применяется к строкам каждой секции.

USE AdventureWorks2012;
GO
SELECT Department, LastName, Rate, HireDate, 
    LAST_VALUE(HireDate) OVER (PARTITION BY Department ORDER BY Rate) AS LastValue
FROM HumanResources.vEmployeeDepartmentHistory AS edh
INNER JOIN HumanResources.EmployeePayHistory AS eph  
    ON eph.BusinessEntityID = edh.BusinessEntityID
INNER JOIN HumanResources.Employee AS e
    ON e.BusinessEntityID = edh.BusinessEntityID
WHERE Department IN (N'Information Services',N'Document Control');

Ниже приводится результирующий набор.

Department                  LastName                Rate         HireDate     LastValue
--------------------------- ----------------------- ------------ ----------   ----------
Document Control            Chai                    10.25        2003-02-23   2003-03-13
Document Control            Berge                   10.25        2003-03-13   2003-03-13
Document Control            Norred                  16.8269      2003-04-07   2003-01-17
Document Control            Kharatishvili           16.8269      2003-01-17   2003-01-17
Document Control            Arifin                  17.7885      2003-02-05   2003-02-05
Information Services        Berg                    27.4038      2003-03-20   2003-01-24
Information Services        Meyyappan               27.4038      2003-03-07   2003-01-24
Information Services        Bacon                   27.4038      2003-02-12   2003-01-24
Information Services        Bueno                   27.4038      2003-01-24   2003-01-24
Information Services        Sharma                  32.4519      2003-01-05   2003-03-27
Information Services        Connelly                32.4519      2003-03-27   2003-03-27
Information Services        Ajenstat                38.4615      2003-02-18   2003-02-23
Information Services        Wilson                  38.4615      2003-02-23   2003-02-23
Information Services        Conroy                  39.6635      2003-03-08   2003-03-08
Information Services        Trenary                 50.4808      2003-01-12   2003-01-12

Б. Использование функций FIRST_VALUE и LAST_VALUE в вычисляемом выражении

В следующем примере с помощью функций FIRST_VALUE и LAST_VALUE, указанных в вычисляемых выражениях, показывается разница между значением квоты продаж для текущего квартала и для первого и последнего квартала года соответственно для данного числа сотрудников. Функция FIRST_VALUE возвращает значение квоты продаж за первый квартал года, затем вычитает его из значения квоты продаж за текущий квартал. Итог возвращается в производном столбце с именем DifferenceFromFirstQuarter. Значение столбца DifferenceFromFirstQuarter за первый квартал года равно 0. Функция LAST_VALUE возвращает значение квоты продаж за последний квартал года и вычитает его из значения квоты продаж за текущий квартал. Итог возвращается в производном столбце с именем DifferenceFromLastQuarter. За последний квартал года значение столбца DifferenceFromLastQuarter составляет 0.

Предложение RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING необходимо в этом примере для ненулевых значений, возвращаемых в столбце DifferenceFromLastQuarter, как показано ниже. Диапазоном по умолчанию является RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW. В этом примере результатом использования указанного диапазона по умолчанию (если не включать диапазон, будет использоваться диапазон по умолчанию) будет возврат нулей в столбце DifferenceFromLastQuarter. Дополнительные сведения см. в разделе Предложение OVER (Transact-SQL).

USE AdventureWorks2012;
SELECT BusinessEntityID, DATEPART(QUARTER,QuotaDate)AS Quarter, YEAR(QuotaDate) AS SalesYear, 
    SalesQuota AS QuotaThisQuarter, 
    SalesQuota - FIRST_VALUE(SalesQuota) 
        OVER (PARTITION BY BusinessEntityID, YEAR(QuotaDate) 
              ORDER BY DATEPART(QUARTER,QuotaDate) ) AS DifferenceFromFirstQuarter, 
    SalesQuota - LAST_VALUE(SalesQuota) 
        OVER (PARTITION BY BusinessEntityID, YEAR(QuotaDate) 
              ORDER BY DATEPART(QUARTER,QuotaDate) 
              RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING ) AS DifferenceFromLastQuarter 
FROM Sales.SalesPersonQuotaHistory 
WHERE YEAR(QuotaDate) > 2005 
AND BusinessEntityID BETWEEN 274 AND 275 
ORDER BY BusinessEntityID, SalesYear, Quarter;

Ниже приводится результирующий набор.

BusinessEntityID Quarter     SalesYear   QuotaThisQuarter      DifferenceFromFirstQuarter DifferenceFromLastQuarter
---------------- ----------- ----------- --------------------- --------------------------- -----------------------
274              1           2006        91000.00              0.00                        -63000.00
274              2           2006        140000.00             49000.00                    -14000.00
274              3           2006        70000.00              -21000.00                   -84000.00
274              4           2006        154000.00             63000.00                    0.00
274              1           2007        107000.00             0.00                        -9000.00
274              2           2007        58000.00              -49000.00                   -58000.00
274              3           2007        263000.00             156000.00                   147000.00
274              4           2007        116000.00             9000.00                     0.00
274              1           2008        84000.00              0.00                        -103000.00
274              2           2008        187000.00             103000.00                   0.00
275              1           2006        502000.00             0.00                        -822000.00
275              2           2006        550000.00             48000.00                    -774000.00
275              3           2006        1429000.00            927000.00                   105000.00
275              4           2006        1324000.00            822000.00                   0.00
275              1           2007        729000.00             0.00                        -489000.00
275              2           2007        1194000.00            465000.00                   -24000.00
275              3           2007        1575000.00            846000.00                   357000.00
275              4           2007        1218000.00            489000.00                   0.00
275              1           2008        849000.00             0.00                        -20000.00
275              2           2008        869000.00             20000.00                    0.00

(20 row(s) affected)