Funciones lógicas - GREATEST (Transact-SQL)

Se aplica a: SQL Server 2022 (16.x) Azure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsPunto de conexión de análisis SQL en Microsoft FabricAlmacenamiento en Microsoft Fabric

Esta función devuelve el valor máximo de una lista de una o varias expresiones.

Convenciones de sintaxis de Transact-SQL

Sintaxis

GREATEST ( expression1 [ , ...expressionN ] )

Argumentos

expresión1, expresiónN

Lista de expresiones separadas por comas de cualquier tipo de datos comparable. La función GREATEST requiere al menos un argumento y no admite más de 254.

Cada expresión puede ser una constante, una variable, un nombre de columna o función, o bien cualquier combinación de operadores aritméticos, bit a bit o de cadena. Se permiten las funciones de agregado y las subconsultas escalares.

Tipos de valores devueltos

Devuelve el tipo de datos con la mayor prioridad del conjunto de tipos pasados a la función. Para obtener más información, vea Prioridad de tipo de datos (Transact-SQL).

Si todos los argumentos tienen el mismo tipo de datos y este se admite para la comparación, GREATEST devuelve ese tipo.

De lo contrario, la función convertirá implícitamente todos los argumentos al tipo de datos con la precedencia más alta antes de la comparación y lo usará como tipo de valor devuelto.

En el caso de los tipos numéricos, la escala del tipo de valor devuelto será la misma que el argumento con la precedencia más alta; en el caso de que esta se dé en varios argumentos, la escala será la más alta.

Observaciones

Todas las expresiones de la lista de argumentos deben ser de un tipo de datos que sea comparable y que se pueda convertir implícitamente al tipo de datos del argumento con la precedencia más alta.

La conversión implícita de todos los argumentos al tipo de datos con mayor precedencia se realizará antes de la comparación.

Si no se admite la conversión implícita de tipos entre los argumentos, se producirá un error en la función y se devolverá un error.

Para obtener más información sobre la conversión implícita y explícita, vea Conversiones de tipos de datos (Motor de base de datos).

Si uno o más argumentos no son NULL, se omiten los argumentos NULL durante la comparación. Si todos los argumentos son NULL, GREATEST devuelve NULL.

La comparación de los argumentos de caracteres sigue las reglas de Prioridad de intercalación (Transact-SQL).

Los tipos siguientes no se admiten para la comparación en GREATEST: varchar(max), varbinary(max) o nvarchar(max) con más de 8000 bytes, cursor, geometría, geografía, imagen, tipos no definidos por el usuario sin orden de bytes, ntext, tabla, text y xml.

Los tipos de datos varchar(max), varbinary(max), and nvarchar(max) se admiten para los argumentos de 8000 bytes o menos, y que convertirán implícitamente a varchar(n), varbinary(n) y nvarchar(n), respectivamente, antes de la comparación.

Por ejemplo, varchar(max) admite hasta 8000 caracteres si se usa un juego de caracteres de codificación de un solo byte y nvarchar(max) admite hasta 4000 pares de bytes (suponiendo que la codificación de caracteres es UTF-16).

Ejemplos

A. Devolución del valor máximo de una lista de constantes

En el ejemplo siguiente, se devuelve el valor máximo de la lista de constantes que se proporciona.

La escala del tipo de valor devuelto viene determinada por la escala del argumento con el tipo de datos de mayor precedencia.

SELECT GREATEST('6.62', 3.1415, N'7') AS GreatestVal;
GO

El conjunto de resultados es el siguiente:

GreatestVal
--------
  7.0000

(1 rows affected)

B. Devolución del valor máximo de una lista de constantes de caracteres

En el ejemplo siguiente, se devuelve el valor máximo de la lista de constantes de caracteres que se proporciona.

SELECT GREATEST('Glacier', N'Joshua Tree', 'Mount Rainier') AS GreatestString;
GO

El conjunto de resultados es el siguiente:

GreatestString
-------------
Mount Rainier

(1 rows affected)

C. Devolución del valor máximo de una lista de argumentos de columna

En este ejemplo, se devuelve el valor máximo de una lista de argumentos de columna y se omiten los valores NULL durante la comparación. En este ejemplo se usa la base de datos AdventureWorksLT, que se puede instalar rápidamente como base de datos de ejemplo para una nueva instancia de Azure SQL Database. Para más información, vea Bases de datos de ejemplo AdventureWorks.

SELECT P.Name,
    P.SellStartDate,
    P.DiscontinuedDate,
    PM.ModifiedDate AS ModelModifiedDate,
    GREATEST(P.SellStartDate, P.DiscontinuedDate, PM.ModifiedDate) AS LatestDate
FROM SalesLT.Product AS P
INNER JOIN SalesLT.ProductModel AS PM
    ON P.ProductModelID = PM.ProductModelID
WHERE GREATEST(P.SellStartDate, P.DiscontinuedDate, PM.ModifiedDate) >= '2007-01-01'
    AND P.SellStartDate >= '2007-01-01'
    AND P.Name LIKE 'Touring %'
ORDER BY P.Name;

El conjunto de resultados es el siguiente: LatestDate elige el mayor valor de fecha de los tres valores, omitiendo NULL.

Name                 SellStartDate           DiscontinuedDate    ModelModifiedDate       LatestDate
-------------------- ----------------------- ------------------- ----------------------- -----------------------
Touring Pedal        2007-07-01 00:00:00.000 NULL                2009-05-16 16:34:29.027 2009-05-16 16:34:29.027
Touring Tire         2007-07-01 00:00:00.000 NULL                2007-06-01 00:00:00.000 2007-07-01 00:00:00.000
Touring Tire Tube    2007-07-01 00:00:00.000 NULL                2007-06-01 00:00:00.000 2007-07-01 00:00:00.000

(3 rows affected)

D. Uso de GREATEST con variables locales

En este ejemplo, se usa GREATEST para determinar el valor máximo de una lista de variables locales en el predicado de una cláusula WHERE.

CREATE TABLE dbo.Studies (
    VarX VARCHAR(10) NOT NULL,
    Correlation DECIMAL(4, 3) NULL
    );

INSERT INTO dbo.Studies
VALUES ('Var1', 0.2),
    ('Var2', 0.825),
    ('Var3', 0.61);
GO

DECLARE @PredictionA DECIMAL(2, 1) = 0.7;
DECLARE @PredictionB DECIMAL(3, 1) = 0.65;

SELECT VarX,
    Correlation
FROM dbo.Studies
WHERE Correlation > GREATEST(@PredictionA, @PredictionB);
GO

El conjunto de resultados es el siguiente: Solo se muestran los valores mayores que 0,7.

VarX       Correlation
---------- -----------
Var2              .825

(1 rows affected)

E. Uso de GREATEST con columnas, constantes y variables

En este ejemplo, se usa GREATEST para determinar el valor máximo de una lista mixta que incluye columnas, constantes y variables.

CREATE TABLE dbo.Studies (
    VarX VARCHAR(10) NOT NULL,
    Correlation DECIMAL(4, 3) NULL
    );

INSERT INTO dbo.Studies
VALUES ('Var1', 0.2),
    ('Var2', 0.825),
    ('Var3', 0.61);
GO

DECLARE @VarX DECIMAL(4, 3) = 0.59;

SELECT VarX,
    Correlation,
    GREATEST(Correlation, 0, @VarX) AS GreatestVar
FROM dbo.Studies;
GO

El conjunto de resultados es el siguiente:

VarX       Correlation           GreatestVar
---------- --------------------- ---------------------
Var1       0.200                 0.590
Var2       0.825                 0.825
Var3       0.610                 0.610

(3 rows affected)

Pasos siguientes