LAG (Transact-SQL)LAG (Transact-SQL)

DIESES THEMA GILT FÜR:jaSQL Server (ab 2012)jaAzure SQL-DatenbankjaAzure SQL Data Warehouse jaParallel Data Warehouse THIS TOPIC APPLIES TO:yesSQL Server (starting with 2012)yesAzure SQL DatabaseyesAzure SQL Data Warehouse yesParallel Data Warehouse

Greift im selben Resultset auf Daten in einer vorherigen Zeile zu, ohne dass ein Selbstjoin ab SQL Server 2012 (11.x)SQL Server 2012 (11.x) verwendet wird.Accesses data from a previous row in the same result set without the use of a self-join starting with SQL Server 2012 (11.x)SQL Server 2012 (11.x). LAG ermöglicht den Zugriff auf eine Zeile mit einem bestimmten physischen Offset vor der aktuellen Zeile.LAG provides access to a row at a given physical offset that comes before the current row. Verwenden Sie diese analytische Funktion in einer SELECT-Anweisung, um Werte in der aktuellen Zeile mit Werten in einer vorherigen Zeile zu vergleichen.Use this analytic function in a SELECT statement to compare values in the current row with values in a previous row.

Symbol zum Themenlink Transact-SQL Syntax Conventions (Transact-SQL) (Transact-SQL-Syntaxkonventionen (Transact-SQL))Topic link icon Transact-SQL Syntax Conventions (Transact-SQL)

SyntaxSyntax

LAG (scalar_expression [,offset] [,default])  
    OVER ( [ partition_by_clause ] order_by_clause )  

ArgumenteArguments

scalar_expressionscalar_expression
Der zurückzugebende Wert auf Grundlage des angegebenen Offsets.The value to be returned based on the specified offset. Dies ist ein Ausdruck eines beliebigen Typs, der einen einzelnen Skalarwert zurückgibt.It is an expression of any type that returns a single (scalar) value. scalar_expression darf keine analytische Funktion sein.scalar_expression cannot be an analytic function.

offsetoffset
Die Anzahl der Zeilen vor der aktuellen Zeile, aus der ein Wert abgerufen werden soll.The number of rows back from the current row from which to obtain a value. Wenn nichts angegeben ist, wird der Standardwert 1 verwendet.If not specified, the default is 1. offset kann eine Spalte, eine Unterabfrage oder ein anderer Ausdruck sein, der eine positive ganze Zahl ergibt, kann aber auch implizit in einen Wert vom Typ bigint konvertiert werden.offset can be a column, subquery, or other expression that evaluates to a positive integer or can be implicitly converted to bigint. offset darf kein negativer Wert bzw. keine analytische Funktion sein.offset cannot be a negative value or an analytic function.

defaultdefault
Der zurückzugebende Wert, wenn scalar_expression bei offset NULL ist.The value to return when scalar_expression at offset is NULL. Wenn kein Standardwert angegeben ist, wird NULL zurückgegeben.If a default value is not specified, NULL is returned. default kann eine Spalte, eine Unterabfrage oder ein anderer Ausdruck sein, jedoch keine analytische Funktion.default can be a column, subquery, or other expression, but it cannot be an analytic function. default muss mit scalar_expression typkompatibel sein.default must be type-compatible with scalar_expression.

OVER ( [ partition_by_clause ] order_by_clause)OVER ( [ partition_by_clause ] order_by_clause)
partition_by_clause unterteilt das von der FROM-Klausel erzeugte Resultset in Partitionen, auf die die Funktion angewendet wird.partition_by_clause divides the result set produced by the FROM clause into partitions to which the function is applied. Wird dies nicht angegeben, verarbeitet die Funktion alle Zeilen des Abfrageresultsets als einzelne Gruppe.If not specified, the function treats all rows of the query result set as a single group. order_by_clause bestimmt die Reihenfolge der Daten, bevor die Funktion angewendet wird.order_by_clause determines the order of the data before the function is applied. Wenn partition_by_clause angegeben wird, wird hierdurch die Reihenfolge der Daten in der Partition bestimmt.If partition_by_clause is specified, it determines the order of the data in the partition. order_by_clause ist erforderlich.The order_by_clause is required. Weitere Informationen finden Sie unter OVER-Klausel (Transact-SQL).For more information, see OVER Clause (Transact-SQL).

RückgabetypenReturn Types

Der Datentyp des angegebenen scalar_expression-Ausdrucks.The data type of the specified scalar_expression. NULL wird zurückgegeben, wenn scalar_expression auf NULL festgelegt werden kann oder default auf NULL festgelegt ist.NULL is returned if scalar_expression is nullable or default is set to NULL.

Allgemeine HinweiseGeneral Remarks

LAG ist nicht deterministisch.LAG is nondeterministic. Weitere Informationen finden Sie unter Deterministic and Nondeterministic Functions.For more information, see Deterministic and Nondeterministic Functions.

BeispieleExamples

A.A. Vergleichen von Werten aus verschiedenen JahrenCompare values between years

Im folgenden Beispiel wird mithilfe der LAG-Funktion die Differenz der Verkaufszahlen für einen bestimmten Mitarbeiter im Verlauf der Vorjahre zurückgegeben.The following example uses the LAG function to return the difference in sales quotas for a specific employee over previous years. Beachten Sie, dass der Standardwert 0 (null) zurückgegeben wird, da für die erste Zeile kein LAG-Wert verfügbar ist.Notice that because there is no lag value available for the first row, the default of zero (0) is returned.

USE AdventureWorks2012;  
GO  
SELECT BusinessEntityID, YEAR(QuotaDate) AS SalesYear, SalesQuota AS CurrentQuota,   
       LAG(SalesQuota, 1,0) OVER (ORDER BY YEAR(QuotaDate)) AS PreviousQuota  
FROM Sales.SalesPersonQuotaHistory  
WHERE BusinessEntityID = 275 and YEAR(QuotaDate) IN ('2005','2006');  

Im Folgenden finden Sie das Resultset.Here is the result set.

BusinessEntityID SalesYear   CurrentQuota          PreviousQuota  
---------------- ----------- --------------------- ---------------------  
275              2005        367000.00             0.00  
275              2005        556000.00             367000.00  
275              2006        502000.00             556000.00  
275              2006        550000.00             502000.00  
275              2006        1429000.00            550000.00  
275              2006        1324000.00            1429000.00  

B.B. Vergleichen von Werten innerhalb von PartitionenCompare values within partitions

Im folgenden Beispiel werden mithilfe der LAG-Funktion die Verkaufszahlen des laufenden Jahres verschiedener Mitarbeiter verglichen.The following example uses the LAG function to compare year-to-date sales between employees. Um die Zeilen im Resultset nach Vertriebsgebiet zu unterteilen, wird die PARTITION BY-Klausel angegeben.The PARTITION BY clause is specified to divide the rows in the result set by sales territory. Die LAG-Funktion wird auf jede Partition einzeln angewendet, und die Berechnung wird für jede Partition neu gestartet.The LAG function is applied to each partition separately and computation restarts for each partition. Die ORDER BY-Klausel in der OVER-Klausel sortiert die Zeilen in jeder Partition.The ORDER BY clause in the OVER clause orders the rows in each partition. Die ORDER BY-Klausel in der SELECT-Anweisung sortiert die Zeilen im gesamten Resultset.The ORDER BY clause in the SELECT statement sorts the rows in the whole result set. Beachten Sie, dass der Standardwert 0 (null) zurückgegeben wird, da für die erste Zeile jeder Partition kein LAG-Wert verfügbar ist.Notice that because there is no lag value available for the first row of each partition, the default of zero (0) is returned.

USE AdventureWorks2012;  
GO  
SELECT TerritoryName, BusinessEntityID, SalesYTD,   
       LAG (SalesYTD, 1, 0) OVER (PARTITION BY TerritoryName ORDER BY SalesYTD DESC) AS PrevRepSales  
FROM Sales.vSalesPerson  
WHERE TerritoryName IN (N'Northwest', N'Canada')   
ORDER BY TerritoryName;  

Im Folgenden finden Sie das Resultset.Here is the result set.

TerritoryName            BusinessEntityID SalesYTD              PrevRepSales  
-----------------------  ---------------- --------------------- ---------------------  
Canada                   282              2604540.7172          0.00  
Canada                   278              1453719.4653          2604540.7172  
Northwest                284              1576562.1966          0.00  
Northwest                283              1573012.9383          1576562.1966  
Northwest                280              1352577.1325          1573012.9383  

C.C. Angeben willkürlicher AusdrückeSpecifying arbitrary expressions

Im folgenden Beispiel wird das Angeben verschiedener willkürlicher Ausdrücke in der Syntax der LAG-Funktion veranschaulicht.The following example demonstrates specifying a variety of arbitrary expressions in the LAG function syntax.

CREATE TABLE T (a int, b int, c int);   
GO  
INSERT INTO T VALUES (1, 1, -3), (2, 2, 4), (3, 1, NULL), (4, 3, 1), (5, 2, NULL), (6, 1, 5);   

SELECT b, c,   
    LAG(2*c, b*(SELECT MIN(b) FROM T), -c/2.0) OVER (ORDER BY a) AS i  
FROM T;  

Im Folgenden finden Sie das Resultset.Here is the result set.

b           c           i  
----------- ----------- -----------  
1           -3          1  
2           4           -2  
1           NULL        8  
3           1           -6  
2           NULL        NULL  
1           5           NULL  

Beispiele: Azure SQL Data WarehouseAzure SQL Data Warehouse und Parallel Data WarehouseParallel Data Warehouse.Examples: Azure SQL Data WarehouseAzure SQL Data Warehouse and Parallel Data WarehouseParallel Data Warehouse

D: Vergleichen von Werten aus verschiedenen QuartalenD: Compare values between quarters

Im folgenden Beispiel wird die LAG-Funktion vorgestellt.The following example demonstrates the LAG function. Die Abfrage verwendet die LAG-Funktion, um die Differenz der Sollvorgaben für den Verkauf für einen bestimmten Mitarbeiter im Verlauf der vorherigen Kalenderquartale zurückgegeben.The query uses the LAG function to return the difference in sales quotas for a specific employee over previous calendar quarters. Beachten Sie, dass der Standardwert 0 (null) zurückgegeben wird, da für die erste Zeile kein LAG-Wert verfügbar ist.Notice that because there is no lag value available for the first row, the default of zero (0) is returned.

-- Uses AdventureWorks  

SELECT CalendarYear, CalendarQuarter, SalesAmountQuota AS SalesQuota,  
       LAG(SalesAmountQuota,1,0) OVER (ORDER BY CalendarYear, CalendarQuarter) AS PrevQuota,  
       SalesAmountQuota - LAG(SalesAmountQuota,1,0) OVER (ORDER BY CalendarYear, CalendarQuarter) AS Diff  
FROM dbo.FactSalesQuota  
WHERE EmployeeKey = 272 AND CalendarYear IN (2001, 2002)  
ORDER BY CalendarYear, CalendarQuarter;   

Im Folgenden finden Sie das Resultset.Here is the result set.

Year Quarter  SalesQuota  PrevQuota  Diff  
---- -------  ----------  ---------  -------------  
2001 3        28000.0000      0.0000   28000.0000  
2001 4         7000.0000  28000.0000  -21000.0000  
2001 1        91000.0000   7000.0000   84000.0000  
2002 2       140000.0000  91000.0000   49000.0000  
2002 3         7000.0000 140000.0000  -70000.0000  
2002 4       154000.0000   7000.0000   84000.0000

Weitere Informationen finden Sie unterSee Also

LEAD (Transact-SQL)LEAD (Transact-SQL)