Freigeben über


LEAD (Transact-SQL)

Greift im gleichen Resultset auf Daten in einer nachfolgenden Zeile zu, ohne dass ein Selbstjoin in SQL Server 2012 verwendet wird. LEAD ermöglicht den Zugriff auf eine Zeile mit einem bestimmten physischen Offset nach der aktuellen Zeilen. Verwenden Sie diese analytische Funktion in einer SELECT-Anweisung, um Werte in der aktuellen Zeile mit Werten in einer nachfolgenden Zeile zu vergleichen.

Themenlink (Symbol) Transact-SQL-Syntaxkonventionen (Transact-SQL)

Syntax

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

Argumente

  • scalar_expression
    Der zurückzugebende Wert auf Grundlage des angegebenen Offsets. Dies ist ein Ausdruck eines beliebigen Typs, der einen einzelnen Skalarwert zurückgibt. scalar_expression darf keine analytische Funktion sein.

  • offset
    Die Anzahl der Zeilen nach der aktuellen Zeile, aus der ein Wert abgerufen werden soll. Wenn nichts angegeben ist, wird der Standardwert 1 verwendet. offset kann eine Spalte, eine Unterabfrage oder ein anderer Ausdruck sein, der eine positive ganze Zahl ergibt, oder er wird implizit in einen Wert vom Typ bigint konvertiert. offset darf kein negativer Wert oder eine analytische Funktion sein.

  • default
    Der zurückzugebende Wert, wenn scalar_expression bei offset NULL ist. Wenn kein Standardwert angegeben ist, wird NULL zurückgegeben. default kann eine Spalte, eine Unterabfrage oder ein anderer Ausdruck sein, jedoch keine analytische Funktion. default muss einen mit scalar_expression kompatiblen Typ aufweisen.

  • OVER ( [ partition_by_clause ] order_by_clause**)**
    partition_by_clause teilt das von der FROM-Klausel erzeugte Resultset in Partitionen, auf die die Funktion angewendet wird. Wird dies nicht angegeben, verarbeitet die Funktion alle Zeilen des Abfrageresultsets als einzelne Gruppe. order_by_clause bestimmt die Reihenfolge der Daten, bevor die Funktion angewendet wird. Wenn partition_by_clause angegeben wird, wird hierdurch die Reihenfolge der Daten in jeder Partition bestimmt. Die Angabe order_by_clause ist erforderlich. Weitere Informationen finden Sie unter OVER-Klausel (Transact-SQL).

Rückgabetypen

Der Datentyp des angegebenen scalar_expression. Wenn scalar_expression NULL-Werte zulässt oder default auf NULL festgelegt wird, wird NULL zurückgegeben.

Beispiele

A.Vergleichen von Werten aus verschiedenen Jahren

Die Abfrage gibt mithilfe der LEAD-Funktion die Differenz zwischen den Umsatzzahlen eines bestimmten Mitarbeiters in Folgejahren zurück. Beachten Sie, dass der Standardwert 0 (null) zurückgegeben wird, da für die letzte Zeile kein LEAD-Wert verfügbar ist.

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

Dies ist das Resultset.

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

B.Vergleichen von Werten innerhalb von Partitionen

Im folgende Beispiel werden mithilfe der LEAD-Funktion die Verkaufszahlen des laufenden Jahres verschiedener Mitarbeiter verglichen. Um die Zeilen im Resultset nach Vertriebsgebiet zu partitionieren, wird die PARTITION BY-Klausel angegeben. Die LEAD-Funktion wird auf jede Partition einzeln angewendet, und die Berechnung wird für jede Partition neu gestartet. Durch die in der OVER-Klausel angegebene ORDER BY-Klausel werden die Zeilen in jeder Partition sortiert, bevor die Funktion angewendet wird. Die ORDER BY-Klausel in der SELECT-Anweisung sortiert die Zeilen im gesamten Resultset. Beachten Sie, dass der Standardwert 0 (null) zurückgegeben wird, da für die letzte Zeile jeder Partition kein LEAD-Wert verfügbar ist.

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

Dies ist das Resultset.

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

C.Angeben beliebiger Ausdrücke

Im folgenden Beispiel wird das Angeben verschiedener beliebiger Ausdrücke in der Syntax der LEAD-Funktion veranschaulicht.

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, 
    LEAD(2*c, b*(SELECT MIN(b) FROM T), -c/2.0) OVER (ORDER BY a) AS i
FROM T;

Dies ist das Resultset.

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

Siehe auch

Verweis

LAG (Transact-SQL)