No me quedo muy claro, como integro la tabla peliculas, con tipo_cambio, sin generar ningun join, como sabe que relacion tiene peliculas con tipo_cambio, seria 1 a muchos?
Introdución a las Bases de Datos
Todo lo que aprenderás sobre PostgreSQL para ciencia de datos
Importación de los datos para el proyecto
Breve historia de las bases de datos
Puntos fuertes de las bases de datos relacionales
Conceptos importantes de las bases de datos relacionales
Principales sentencias SQL
Ciencia de Datos
¿Qué es la ciencia de datos?
Aplicación de la ciencia de datos
Equipos orientados a datos
Data science vs. Machine Learning
Particularidades de PostgreSQL
Diferencias entre otros manejadores y PostgreSQL
Conoce los superpoderes de PLPGSQL
PLPGSQL: Stored procedures
PLPGSQL: conteo, registro y triggers
PLPGSQL: Aplicado a data science
Integración con otros lenguajes
Tipos de Datos Personalizados
Casos Prácticos
Explicación de la estructura de la base de datos de ejemplo
Agregación de datos
Pensando en la presentación
Trabajando con objetos
Agregando objetos
Common table expressions
Window functions
Particiones
Platzi movies dashboard
Presentación del proyecto
Top 10
Actualizando precios
Usando rank y percent rank
Ordenando datos geográficos
Datos en el tiempo
Visualizando datos con Tableau
Siguientes pasos
¿Qué sigue?
Compartu tu proyecto de Platzi Movies Dashboard y certifícate
No tienes acceso a esta clase
¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera
Israel Vázquez Morales
Aportes 37
Preguntas 8
No me quedo muy claro, como integro la tabla peliculas, con tipo_cambio, sin generar ningun join, como sabe que relacion tiene peliculas con tipo_cambio, seria 1 a muchos?
1️⃣ Parte 1: Crear el código del trigger
INSERT_INTO()
.NEW
en el trigger. Esto devuelve el registro.-- *** PARTE 1 *** ---
-- Trigger functions > Create > Code
BEGIN
-- Paso 1
INSERT INTO precio_peliculas_tipo_cambio(
pelicula_id,
tipo_cambio_id,
precio_tipo_cambio,
ultima_actualizacion)
-- Paso 2
SELECT NEW.pelicula_id,
tipos_cambio.tipo_cambio_id,
tipos_cambio.cambio_usd * NEW.precio_renta AS precio_tipo_cambio,
CURRENT_TIMESTAMP
FROM tipos_cambio
WHERE tipos_cambio.codigo = 'MXN';
-- Paso 3
RETURN NEW;
END
2️⃣ Parte 2: Crear el trigger
Aquí hay que indicar:
-- *** PARTE 2 *** --
-- (Opcional)
DROP TRIGGER IF EXISTS trigger_update_tipos_cambio
ON public.peliculas;
-- Paso 1
CREATE TRIGGER trigger_update_tipos_cambio
-- Paso 2
AFTER INSERT OR UPDATE
-- Paso 3
ON public.peliculas
-- Paso 4
FOR EACH ROW
-- Paso 5
EXECUTE PROCEDURE public.precio_peliculas_tipo_cambio();
Totalmente perdido en esta clase 😕
La tuve que ver como 3 veces seguidas pero al final entendí
Código del trigger function
CREATE OR REPLACE FUNCTION public.precio_peliculas_tipo_cambio()
returns trigger
LANGUAGE plpgsql
AS $$
BEGIN
INSERT INTO precio_peliculas_tipo_cambio(
pelicula_id,
tipo_cambio_id,
precio_tipo_cambio,
ultima_actualizacion
)
select NEW.pelicula_id,
tipos_cambio.tipo_cambio_id,
tipos_cambio.cambio_usd * NEW.precio_renta AS precio_tipo_cambio,
CURRENT_TIMESTAMP
FROM tipos_cambio
WHERE tipos_cambio.codigo = 'MXN';
RETURN NEW;
END
$$
;
Código del trigger en la tabla precio_peliculas_tipo_cambio
create trigger trigger_update_tipos_cambio after
insert
or
update
on
public.peliculas for each row execute procedure public.precio_peliculas_tipo_cambio() ;
Pienso que esta parte de trigger debe haber un curso no tan extenso para diferentes casos hay muchos que se pierden me eh dado cuenta que dominar este superpoder no basta con pocos ejemplos.
Estaba un poco perdido en la parte de la función trigger ahora que eh revisado veo que primero va el insert y luego el select para considerar la conversión entonces lo que va ser el disparador es que cada vez que nosotros cambiemos un monto el disparado manda el update luego la función trigger se ejecuta y realiza la inserción con los campos de la nueva tabla que se realizo previamente luego el select funciona como values ya que recogera lo que se selecciona entonces insert into actualiza el dato.
Que beneficio tenemos con esto:
- que cada vez que queramos actualizar un monto en cualquier precio solamente vas a la tabla cambias el precio.
Cual es el superpoder : El resto lo hará el disparador.
Me perdí en esta clase, entendí hasta antes de que empiece con los Triggers.
Esta parte me dejo muchas dudas, veo que se lanza sin mas a crear un tigger con la ayuda grafica del Pstgres. pero hay en esa nueva forma hay partes como la de public.??..hay como que se fue el curso.
Caso Práctico de Triggers
Yo pude seguir la clase pero lo que me paso es que muchas tablas estan actualizadas y por eso ya tenia llena la nueva tabla de actualizacion
no quedo muy claro
En que casos será mejor este tipo de acciones que se hacen con los triggers y no una acción dentro del código de una aplicación que use esta base de datos (ej. php, python).
SELECT peliculas.pelicula_id,
tipos_cambio.tipo_cambio_id,
tipos_cambio.cambio_usd * peliculas.precio_renta AS precio_MXN
FROM peliculas, tipos_cambio
WHERE tipos_cambio.codigo = 'MXN'
CREATE TRIGGER trigger_update_tipos_cambio
AFTER INSERT OR UPDATE
ON public.peliculas
FOR EACH ROW
EXECUTE PROCEDURE public.precio_peliculas_tipo_cambio();
para el de Colombia:
BEGIN
INSERT INTO precio_peliculas_tipo_cambio(
pelicula_id,
tipo_cambio_id,
precio_tipo_cambio,
ultima_actualizacion
)
SELECT NEW.pelicula_id,
t.tipo_cambio_id,
t.cambio_usd * NEW.precio_renta AS precio_tipo_cambio,
CURRENT_TIMESTAMP
FROM tipos_cambio AS t
WHERE t.codigo = 'COP';
END
Se me complican mucho los triggers 😦
Esta haciendo un trigger de in trigger XD
—Creating Trigger function instructions—
Creamos las intrucciones del Trigger, en este caso actualizar los precios de las películas en una nueva tabla (precio_peliculas_tipo_cambio) con sus respectivos precios convertidos de usd a mxn (tipos_cambio.cambio_usd * NEW.precio_renta):
BEGIN
INSERT INTO precio_peliculas_tipo_cambio(
pelicula_id,
tipo_cambio_id,
precio_tipo_cambio,
ultima_actualizacion
)
SELECT NEW.pelicula_id,
tipos_cambio.tipo_cambio_id,
tipos_cambio.cambio_usd * NEW.precio_renta AS precio_tipo_cambio,
CURRENT_TIMESTAMP
FROM tipos_cambio
WHERE tipos_cambio = 'MXN';
RETURN NEW;
END
—Creating Trigger call execution (query)—
Creando ejecución del Trigger (mediante Query), tras la cual el Trigger queda en funcionamiento:
CREATE TRIGGER trigger_update_tipos_cambio
AFTER INSERT OR UPDATE
ON public.peliculas
FOR EACH ROW
EXECUTE PROCEDURE public.precio_peliculas_tipo_cambio();
El mismo se activará luego (AFTER) de que insertemos o actualicemos (INSERT OR UPDATE) nuestra tabla peliculas (public.peliculas), tras lo cual se añadirá/actualizará la conversión de tipo de cambio para cada pelicula hacia nuestra nueva tabla (precio_peliculas_tipo_cambio).
Entendiendo cada vez un poco mas SQL
SELECT peliculas.pelicula_id,
peliculas.clasificacion,
tipos_cambio.tipo_cambio_id,
tipos_cambio.cambio_usd * peliculas.precio_renta AS precio_mxn
FROM peliculas,
tipos_cambio
WHERE tipos_cambio.codigo = 'MXN' AND peliculas.clasificacion = 'R';
Comparto mi código, que automatiza la inserción de precios para cada tipo de cambio que exista:
CREATE OR REPLACE FUNCTION price_movies_change_type()
RETURNS trigger
LANGUAGE plpgsql
AS
$$
BEGIN
WITH RECURSIVE recursive_tab (n) AS
(
VALUES (1)
UNION ALL
SELECT n+1 FROM recursive_tab WHERE n < (SELECT MAX(tipos_cambio.tipo_cambio_id) FROM tipos_cambio)
)
INSERT INTO precio_peliculas_tipo_cambio(
pelicula_id,
tipo_cambio_id,
precio_tipo_cambio,
ultima_actualizacion)
SELECT
NEW.pelicula_id,
tipos_cambio.tipo_cambio_id,
NEW.precio_renta * tipos_cambio.cambio_usd,
CURRENT_TIMESTAMP
FROM
recursive_tab,
tipos_cambio
WHERE tipos_cambio.tipo_cambio_id = n;
RETURN NEW;
END
$$
CREATE TRIGGER trigger_update_change_type
AFTER INSERT OR UPDATE
ON public.peliculas
FOR EACH ROW
EXECUTE PROCEDURE public.price_movies_change_type();
Me parece que falto profundizar en la parte de la creación del trigger, ya que el ejemplo es muy complejo para mi de entender.
creo que la mayoria no vio previamente el curos de PostgreSQL, por eso estan perdidos, ahi explican mas a fondo lo de los triiggers
Los cursos de Israel son bastante buenos, pero lo que he podido evidenciar a lo largo de la ruta de aprendizaje es que es una metodología orientada a la auditoria de BD, es decir hacia convertirte en un DBA, sin embargo es muy bueno lo que acá se muestra y es conocer la estructura de las consultas.
CONSULTA ME DICE EN EL MIN 11:10 : ERROR: no existe la función public.update_precio_peliculas_tipo_cambio()
SQL state: 42883
Edgar, respecto a su inquietud, no se join entre las 2 tablas porque solo hay un tipo de moneda, y en ese sentido como filtra por pesos mexicanos solo va a ver un solo registro de salida en el tipo de cambio.
Es interesante el desarrollo de este tipo de proyectos, pero desde lo que conozco y la teoría de normalización de las bases de datos los datos deben ser únicos y no deberíamos tener datos que puedan ser calculados, para evitar la redundancia, de igual forma existen las vistas y podríamos generar una vista que nos permita tener los datos de las monedas
-- DROP VIEW public."V_Precios_Monedas";
CREATE OR REPLACE VIEW public."V_Precios_Monedas" AS
SELECT P.pelicula_id,
TC.codigo,
TC.cambio_usd * P.precio_renta AS precio_cambio
FROM peliculas as P,
tipos_cambio as TC;
Buen ejercicio, claro, se debería colocar una opción que este tipo de cursos no se habiliten si no ven el básico, de este por ejemplo el curso de PostgreSQL, dado que en este se explica esto que hace Israel
Para la primera parte al tratar de hacerlo por mi mismo encontré este otro query
SELECT peliculas.pelicula_id,
tipos_cambio.tipo_cambio_id,
tipos_cambio.cambio_usd * peliculas.precio_renta AS precio_mxn
FROM precio_peliculas_tipo_cambio
INNER JOIN peliculas ON peliculas.pelicula_id = precio_peliculas_tipo_cambio.pelicula_id
INNER JOIN tipos_cambio ON precio_peliculas_tipo_cambio.tipo_cambio_id = tipos_cambio.tipo_cambio_id
GROUP BY peliculas.pelicula_id, tipos_cambio.tipo_cambio_id
ORDER BY peliculas.pelicula_id
Entendido
como puedo llenar campos vacios en postgre?
Pense que habia un error en esta consulta, ya que no existe la realación peliculas y tipo de cambio en el where. Pero entendí que el precio de renta esta dado en USD, por lo que todos los registros de la tabla peliculas se multiplican con el el mismo valor (tipo_cambio.cambio_usd)
De donde saca el tipo de cambio? es en tiempo real ?
Excelente clase, creo que no era necesario utilizar el lenguage plpgsql, con el lenguage SQL era suficiente, pero como practica esta clase me parece genial. Gracias.
interesante
buen ejercicio
¿Quieres ver más aportes, preguntas y respuestas de la comunidad?