Freigeben über


FIRST_VALUE (Transact-SQL)

Gilt für: SQL Server Azure SQL-Datenbank Azure SQL verwaltete Instanz Azure Synapse Analytics Platform System (PDW) Azure SQL Edge SQL Analytics Endpoint in Microsoft Fabric Warehouse in Microsoft Fabric

Hiermit wird der erste Wert in einer geordneten Menge von Werten zurückgegeben.

Transact-SQL-Syntaxkonventionen

Syntax

FIRST_VALUE ( [ scalar_expression ] ) [ IGNORE NULLS | RESPECT NULLS ]
    OVER ( [ partition_by_clause ] order_by_clause [ rows_range_clause ] )

Argumente

scalar_expression

Der zurückzugebende Wert. scalar_expression kann eine Spalte, eine Unterabfrage oder ein anderer willkürlicher Ausdruck sein, durch die sich ein einzelner Wert ergibt. Andere analytische Funktionen sind nicht zulässig.

[ IGNORE NULLS | RESPECT NULLS ]

Gilt für: SQL Server (ab SQL Server 2022 (16.x)), Azure SQL-Datenbank und Azure SQL Managed Instance, Azure SQL Edge

IGNORE NULLS – Ignorieren Sie NULL-Werte im Dataset, wenn Sie den ersten Wert über eine Partition berechnen.

RESPECT NULLS - Achten Sie beim Berechnen des ersten Werts über eine Partition auf NULL-Werte im Dataset. RESPECT NULLS ist das Standardverhalten, wenn keine NULLS-Option angegeben ist.

Weitere Informationen zu diesem Argument in Azure SQL Edge finden Sie unter Imputing fehlender Werte.

OVER ( [ partition_by_clause ] order_by_clause [ rows_range_clause ] )

partition_by_clause unterteilt 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 logische Reihenfolge, in der der Vorgang ausgeführt wird. order_by_clause ist erforderlich.

rows_range_clause schränkt die Zeilen innerhalb der Partition weiter ein, indem Ausgangs- und Endpunkte angegeben werden.

Weitere Informationen finden Sie unter OVER-Klausel (Transact-SQL).

Rückgabetypen

Entspricht dem Typ von scalar_expression.

Bemerkungen

FIRST_VALUE ist nicht deterministisch. Weitere Informationen finden Sie unter Deterministische und nicht deterministische Funktionen.

Beispiele

A. Verwenden von FIRST_VALUE für ein Abfrageresultset

Im folgenden Beispiel wird der Name des günstigsten Produkts in einer bestimmten Produktkategorie mithilfe von FIRST_VALUE zurückgegeben.

USE AdventureWorks2022;
GO

SELECT Name,
    ListPrice,
    FIRST_VALUE(Name) OVER (
        ORDER BY ListPrice ASC
    ) AS LeastExpensive
FROM Production.Product
WHERE ProductSubcategoryID = 37;

Hier sehen Sie das Ergebnis.

Name                    ListPrice             LeastExpensive
----------------------- --------------------- --------------------
Patch Kit/8 Patches     2.29                  Patch Kit/8 Patches
Road Tire Tube          3.99                  Patch Kit/8 Patches
Touring Tire Tube       4.99                  Patch Kit/8 Patches
Mountain Tire Tube      4.99                  Patch Kit/8 Patches
LL Road Tire            21.49                 Patch Kit/8 Patches
ML Road Tire            24.99                 Patch Kit/8 Patches
LL Mountain Tire        24.99                 Patch Kit/8 Patches
Touring Tire            28.99                 Patch Kit/8 Patches
ML Mountain Tire        29.99                 Patch Kit/8 Patches
HL Road Tire            32.60                 Patch Kit/8 Patches
HL Mountain Tire        35.00                 Patch Kit/8 Patches

B. Verwenden von FIRST_VALUE für mehrere Partitionen

Im folgenden Beispiel werden die Mitarbeiter mit der geringsten Anzahl von Urlaubsstunden im Vergleich zu anderen Angestellten mit der gleichen Berufsbezeichnung mithilfe von FIRST_VALUE zurückgegeben. Die PARTITION BY-Klausel partitioniert die Mitarbeiter nach der Berufsbezeichnung, und die FIRST_VALUE-Funktion wird auf jede Partition separat angewendet. Die in der ORDER BY-Klausel angegebene OVER-Klausel bestimmt die logische Reihenfolge, in der die FIRST_VALUE-Funktion auf die Zeilen in jeder Partition angewendet wird. Die ROWS UNBOUNDED PRECEDING-Klausel gibt den Ausgangspunkt des Fensters als erste Zeile jeder Partition an.

USE AdventureWorks2022;
GO

SELECT JobTitle,
    LastName,
    VacationHours,
    FIRST_VALUE(LastName) OVER (
        PARTITION BY JobTitle ORDER BY VacationHours ASC ROWS UNBOUNDED PRECEDING
    ) AS FewestVacationHours
FROM HumanResources.Employee AS e
INNER JOIN Person.Person AS p
    ON e.BusinessEntityID = p.BusinessEntityID
ORDER BY JobTitle;

Hier sehen Sie das Ergebnis.

JobTitle                            LastName                  VacationHours FewestVacationHours
----------------------------------- ------------------------- ------------- -------------------
Accountant                          Moreland                  58            Moreland
Accountant                          Seamans                   59            Moreland
Accounts Manager                    Liu                       57            Liu
Accounts Payable Specialist         Tomic                     63            Tomic
Accounts Payable Specialist         Sheperdigian              64            Tomic
Accounts Receivable Specialist      Poe                       60            Poe
Accounts Receivable Specialist      Spoon                     61            Poe
Accounts Receivable Specialist      Walton                    62            Poe