Función de ventana LISTAGG - Amazon Redshift

Función de ventana LISTAGG

Para cada grupo de una consulta, la función de ventana LISTAGG ordena las filas de ese cada grupo según la expresión ORDER BY y luego concatena los valores en una sola cadena.

Sintaxis

LISTAGG( [DISTINCT] expression [, 'delimiter' ] ) [ WITHIN GROUP (ORDER BY order_list) ] OVER ( [PARTITION BY partition_expression] )

Argumentos

DISTINCT

(Opcional) Una cláusula que elimina los valores duplicados de la expresión especificada antes de la concatenación. Se omiten los espacios posteriores y, por tanto, las cadenas 'a' y 'a ' se tratan como duplicados. LISTAGG usa el primer valor que se encuentra. Para obtener más información, consulte Importancia de los espacios en blancos anteriores y posteriores.

expresión_de_agregación

Toda expresión válida (como un nombre de columna) que proporcione los valores para la agregación. Se ignoran los valores NULL y las cadenas vacías.

delimiter

(Opcional) La constante de cadena que separará los valores concatenados. El valor predeterminado es NULL.

WITHIN GROUP (ORDER BY order_list)

(Opcional) Una cláusula que especifica el orden de los valores agregados. Determinístico solamente si ORDER BY proporciona un ordenamiento único. La opción predeterminada es agregar todas las filas y devolver un valor único.

OVER

Una cláusula que especifica la partición de ventana. La cláusula OVER no puede contener una especificación de marco de ventana u ordenamiento.

PARTITION BY partition_expression

(Opcional) Establece el rango de registros para cada grupo en la cláusula OVER.

Devuelve

VARCHAR(MAX). Si el conjunto de resultados es mayor que el tamaño máximo VARCHAR (64K - 1 o 65535), LISTAGG devuelve el siguiente error:

Invalid operation: Result size exceeds LISTAGG limit

Ejemplos

En los siguientes ejemplos, se utiliza la tabla WINSALES. Para ver una descripción de la tabla WINSALES, consulte Tabla de muestra para ejemplos de funciones de ventana.

El siguiente ejemplo devuelve una lista de ID de vendedores ordenados por ID de vendedor.

select listagg(sellerid) within group (order by sellerid) over() from winsales; listagg ------------ 11122333344 ... ... 11122333344 11122333344   (11 rows)

El siguiente ejemplo devuelve una lista de ID de vendedores para el comprador B, ordenados por fecha.

select listagg(sellerid) within group (order by dateid) over () as seller from winsales where buyerid = 'b' ; seller --------- 3233 3233 3233 3233

El siguiente ejemplo devuelve una lista separada por comas de fechas de ventas para el comprador B.

select listagg(dateid,',') within group (order by sellerid desc,salesid asc) over () as dates from winsales where buyerid = 'b'; dates ------------------------------------------- 2003-08-02,2004-04-18,2004-04-18,2004-02-12 2003-08-02,2004-04-18,2004-04-18,2004-02-12 2003-08-02,2004-04-18,2004-04-18,2004-02-12 2003-08-02,2004-04-18,2004-04-18,2004-02-12

En el siguiente ejemplo, se usa DISTINCT para devolver una lista de fechas de venta distintas para el comprador B.

select listagg(distinct dateid,',') within group (order by sellerid desc,salesid asc) over () as dates from winsales where buyerid = 'b'; dates -------------------------------- 2003-08-02,2004-04-18,2004-02-12 2003-08-02,2004-04-18,2004-02-12 2003-08-02,2004-04-18,2004-02-12 2003-08-02,2004-04-18,2004-02-12

El siguiente ejemplo devuelve una lista separada por comas de ID de ventas para cada ID de comprador.

select buyerid, listagg(salesid,',') within group (order by salesid) over (partition by buyerid) as sales_id from winsales order by buyerid; +---------+-------------------------+ | buyerid | sales_id | +---------+-------------------------+ | a | 10005,40001,40005 | | a | 10005,40001,40005 | | a | 10005,40001,40005 | | b | 20001,30001,30003,30004 | | b | 20001,30001,30003,30004 | | b | 20001,30001,30003,30004 | | b | 20001,30001,30003,30004 | | c | 10001,10006,20002,30007 | | c | 10001,10006,20002,30007 | | c | 10001,10006,20002,30007 | | c | 10001,10006,20002,30007 | +---------+-------------------------+