Condividi tramite


FIRST_VALUE (Transact-SQL)

Si applica a: SQL Server database SQL di Azure Istanza gestita di SQL di Azure azure Synapse Analytics Platform System (PDW) azure SQL Edge SQL Analytics endpoint in Microsoft Fabric Warehouse in Microsoft Fabric

Restituisce il primo valore in un set ordinato di valori.

Convenzioni relative alla sintassi Transact-SQL

Sintassi

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

Argomenti

scalar_expression

Valore da restituire. scalar_expression può essere una colonna, una sottoquery o un'altra espressione arbitraria che restituisce un solo valore. Altre funzioni analitiche non sono consentite.

[ IGNORE NULLS | RESPECT NULLS ]

Si applica a: SQL Server (a partire da SQL Server 2022 (16.x)), database SQL di Azure, Istanza gestita di SQL di Azure, SQL Edge di Azure

IGNORE NULLS - Ignorare i valori Null nel set di dati durante il calcolo del primo valore su una partizione.

RESPECT NULLS - Rispettare i valori Null nel set di dati durante il calcolo del primo valore su una partizione. RESPECT NULLS è il comportamento predefinito se non è specificata un'opzione NULLS.

Per altre informazioni su questo argomento in SQL Edge di Azure, vedere Imputazione di valori mancanti.

OVER ( [ partition_by_clause ] order_by_clause [ rows_range_clause ] )

partition_by_clause suddivide il set di risultati generato dalla clausola FROM in partizioni alle quali viene applicata la funzione. Se non specificato, la funzione tratta tutte le righe del set di risultati della query come un unico gruppo.

order_by_clause determina l'ordine logico in cui viene eseguita l'operazione. order_by_clause è obbligatorio.

rows_range_clause limita ulteriormente le righe all'interno della partizione specificando i punti iniziali e finali.

Per altre informazioni, vedere Clausola OVER (Transact-SQL).

Tipi restituiti

Stesso tipo di scalar_expression.

Osservazioni:

FIRST_VALUE è non deterministico. Per altre informazioni, vedere Funzioni deterministiche e non deterministiche.

Esempi

R. Usare FIRST_VALUE su un set di risultati della query

Nell'esempio seguente viene usato FIRST_VALUE per restituire il nome del prodotto meno costoso in una categoria di prodotto specificata.

USE AdventureWorks2022;
GO

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

Il set di risultati è il seguente.

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. Usare FIRST_VALUE su partizioni

Nell'esempio seguente viene usato FIRST_VALUE per restituire il dipendente con il minor numero di ore di ferie rispetto agli altri dipendenti con la stessa posizione. La clausola PARTITION BY suddivide i dipendenti in base alla posizione e la funzione FIRST_VALUE viene applicata indipendentemente a ogni partizione. La clausola ORDER BY specificata nella clausola OVER determina l'ordine logico in cui la funzione FIRST_VALUE viene applicata alle righe in ogni partizione. La clausola ROWS UNBOUNDED PRECEDING specifica il punto iniziale della finestra come prima riga di ogni partizione.

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;

Il set di risultati è il seguente.

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