FIRST_VALUE (Transact-SQL)
Aplica-se a: SQL Server
Banco de Dados
SQL do Azure Instância Gerenciada de SQL do
Azure PDW (Sistema de Plataforma de Análise)
do Azure SQL
do Edge
Ponto de extremidade de análise de SQL no Microsoft Fabric
Warehouse no Microsoft Fabric
Retorna o primeiro valor em um conjunto ordenado de valores.
Convenções de sintaxe de Transact-SQL
Sintaxe
FIRST_VALUE ( [ scalar_expression ] ) [ IGNORE NULLS | RESPECT NULLS ]
OVER ( [ partition_by_clause ] order_by_clause [ rows_range_clause ] )
Observação
Para exibir a sintaxe do Transact-SQL para o SQL Server 2014 (12.x) e versões anteriores, confira a Documentação das versões anteriores.
Argumentos
scalar_expression
O valor a ser retornado. scalar_expression pode ser uma coluna, subconsulta ou outra expressão arbitrária que resulta em um único valor. Outras funções analíticas não são permitidas.
[ IGNORE NULLS | RESPECT NULLS ]
Aplica-se a: SQL Server, do SQL Server 2022 (16.x) em diante; Banco de Dados SQL do Azure; Instância Gerenciada de SQL do Azure; e SQL do Azure no Edge
IGNORE NULLS
- Ignore valores nulos no conjunto de dados ao calcular o primeiro valor em uma partição.
RESPECT NULLS
- Respeite os valores nulos no conjunto de dados ao calcular o primeiro valor em uma partição. RESPECT NULLS
é o comportamento padrão se uma opção NULLS não for especificada.
Para obter mais informações sobre esse argumento no SQL do Azure no Edge, consulte Imputando valores ausentes.
OVER ( [ partition_by_clause ] order_by_clause [ rows_range_clause ] )
A partition_by_clause divide o conjunto de resultados produzido pela cláusula FROM em partições às quais a função é aplicada. Se não for especificado, a função tratará todas as linhas do conjunto de resultados da consulta como um único grupo.
A order_by_clause determina a ordem lógica na qual a operação é executada. order_by_clause é obrigatória.
rows_range_clause limita ainda mais as linhas dentro da partição com a especificação de pontos iniciais e finais.
Para obter mais informações, confira Cláusula OVER (Transact-SQL).
Tipos de retorno
O mesmo tipo que scalar_expression.
Comentários
FIRST_VALUE
é não determinístico. Para obter mais informações, confira Funções determinísticas e não determinísticas.
Exemplos
a. Usar FIRST_VALUE em um conjunto de resultados da consulta
O exemplo a seguir usa FIRST_VALUE
para retornar o nome do produto mais barato em uma determinada categoria de produto.
USE AdventureWorks2022;
GO
SELECT Name,
ListPrice,
FIRST_VALUE(Name) OVER (
ORDER BY ListPrice ASC
) AS LeastExpensive
FROM Production.Product
WHERE ProductSubcategoryID = 37;
Este é o conjunto de resultados.
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. Usar FIRST_VALUE em partições
O exemplo a seguir usa FIRST_VALUE
para retornar o funcionário com o menor número de horas de férias em comparação com a outros funcionários no mesmo cargo. A cláusula PARTITION BY
particiona os funcionários por cargo e a função FIRST_VALUE
é aplicada a cada partição de modo independente. A cláusula ORDER BY
especificada na cláusula OVER
determina a ordem lógica na qual a função FIRST_VALUE
é aplicada às linhas em cada partição. A cláusula ROWS UNBOUNDED PRECEDING
especifica que o ponto de partida da janela é a primeira linha de cada partição.
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;
Este é o conjunto de resultados.
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