Amazon Redshift dejará de admitir la creación de UDF de Python después del 30 de junio de 2026. Empezaremos a aplicarlo por fases. Para obtener más información sobre los detalles del fin de vida de Python y las opciones de migración, consulte la entrada del blog
Ejemplos de fusión
En los siguientes ejemplos, se realiza una fusión para actualizar la tabla SALES. En el primer ejemplo, se usa el método más simple de eliminar desde la tabla destino y, luego, se insertan todas las filas desde la tabla provisional. En el segundo ejemplo, se requiere la actualización de columnas seleccionadas de la tabla destino, por lo que se incluye un paso de actualización adicional.
En los Ejemplos de fusión se usa un conjunto de datos de muestra para Amazon Redshift, denominado conjunto de datos TICKIT. Como requisito previo, puede configurar las tablas y los datos de TICKIT siguiendo las instrucciones disponibles en Introducción a las tareas comunes de bases de datos. Encontrará información más detallada sobre el conjunto de datos de muestra en Base de datos de muestra.
Origen de datos de la fusión de muestra
Los ejemplos de esta sección usan un origen de datos de ejemplo que incluye tanto actualizaciones como inserciones. Para configurar los datos de ejemplo, cree una tabla llamada SALES_UPDATE a partir de la tabla SALES y rellénela con datos asignados al azar que representen la nueva actividad de ventas de diciembre. Los ejemplos siguientes usan la tabla SALES_UPDATE como tabla provisional.
-- Create a sample table as a copy of the SALES table. create table tickit.sales_update as select * from tickit.sales; -- Change every fifth row to have updates. update tickit.sales_update set qtysold = qtysold*2, pricepaid = pricepaid*0.8, commission = commission*1.1 where saletime > '2008-11-30' and mod(sellerid, 5) = 0; -- Add some new rows to have inserts. -- This example creates a duplicate of every fourth row. insert into tickit.sales_update select (salesid + 172456) as salesid, listid, sellerid, buyerid, eventid, dateid, qtysold, pricepaid, commission, getdate() as saletime from tickit.sales_update where saletime > '2008-11-30' and mod(sellerid, 4) = 0;
Ejemplo de una fusión que reemplaza filas existentes en las claves coincidentes
El ejemplo siguiente usa la tabla SALES_UPDATE para realizar una operación de fusión en la tabla SALES con datos nuevos para la actividad de ventas de diciembre. La fusión reemplaza las filas de la tabla SALES que tienen actualizaciones, modificando las columnas qtysold y pricepaid mientras deja commission y saletime sin cambios.
MERGE into tickit.sales USING tickit.sales_update sales_update on ( sales.salesid = sales_update.salesid and sales.listid = sales_update.listid and sales_update.saletime > '2008-11-30' and (sales.qtysold != sales_update.qtysold or sales.pricepaid != sales_update.pricepaid)) WHEN MATCHED THEN update SET qtysold = sales_update.qtysold, pricepaid = sales_update.pricepaid WHEN NOT MATCHED THEN INSERT (salesid, listid, sellerid, buyerid, eventid, dateid, qtysold , pricepaid, commission, saletime) values (sales_update.salesid, sales_update.listid, sales_update.sellerid, sales_update.buyerid, sales_update.eventid, sales_update.dateid, sales_update.qtysold , sales_update.pricepaid, sales_update.commission, sales_update.saletime); -- Drop the staging table. drop table tickit.sales_update; -- Test to see that commission and salestime were not impacted. SELECT sales.salesid, sales.commission, sales.salestime, sales_update.commission, sales_update.salestime FROM tickit.sales INNER JOIN tickit.sales_update sales_update ON sales.salesid = sales_update.salesid AND sales.listid = sales_update.listid AND sales_update.saletime > '2008-11-30' AND (sales.commission != sales_update.commission OR sales.salestime != sales_update.salestime);
Ejemplo de fusión que especifica una lista de columnas sin utilizar MERGE
El ejemplo siguiente realiza una operación de fusión en la tabla SALES con datos nuevos para la actividad de diciembre, con la tabla SALES_UPDATE como el origen de datos. Los datos de ejemplo incluyen actualizaciones, inserciones y filas sin cambios. La fusión actualiza las columnas qtysold y pricepaid pero deja commission y saletime sin cambios.
-- Create a staging table and populate it with rows from SALES_UPDATE for Dec create temp table stagesales as select * from sales_update where saletime > '2008-11-30'; -- Start a new transaction begin transaction; -- Update the target table using an inner join with the staging table -- The join includes a redundant predicate to collocate on the distribution key –- A filter on saletime enables a range-restricted scan on SALES update sales set qtysold = stagesales.qtysold, pricepaid = stagesales.pricepaid from stagesales where sales.salesid = stagesales.salesid and sales.listid = stagesales.listid and stagesales.saletime > '2008-11-30' and (sales.qtysold != stagesales.qtysold or sales.pricepaid != stagesales.pricepaid); -- Delete matching rows from the staging table -- using an inner join with the target table delete from stagesales using sales where sales.salesid = stagesales.salesid and sales.listid = stagesales.listid; -- Insert the remaining rows from the staging table into the target table insert into sales select * from stagesales; -- End transaction and commit end transaction; -- Drop the staging table drop table stagesales;