CodeGym /Cursos /SQL SELF /Registro de datos analíticos en tablas separadas

Registro de datos analíticos en tablas separadas

SQL SELF
Nivel 60 , Lección 1
Disponible

Imagina que estás haciendo un informe de ventas de la semana. Los cálculos están listos, los clientes están contentos. Pero al mes te preguntan: "¿Puedes mostrar lo que había en ese informe?" Si no guardaste los datos de antemano, tendrás que reconstruirlos a mano o decir "no puedo". No solo es incómodo, también puede afectar tu reputación.

El registro de datos analíticos resuelve varias tareas importantes:

  • Guardar el historial: fijas las métricas clave (por ejemplo, ingresos, número de pedidos) para ciertos periodos.
  • Auditoría y diagnóstico: si algo sale mal, siempre puedes revisar qué datos se registraron.
  • Comparación de datos: añadiendo marcas de tiempo, puedes analizar cómo cambian los indicadores con el tiempo.
  • Reutilización de datos: las métricas guardadas pueden usarse en otras tareas analíticas.

Idea principal: tabla log_analytics

Para registrar datos analíticos creamos una tabla especial que guarda todos los indicadores clave. Cada nuevo resultado es una nueva fila en la tabla. Para entender mejor cómo funciona, vamos a empezar con un escenario básico.

Ejemplo de estructura de tabla

En la tabla log_analytics vamos a guardar datos sobre informes. Aquí tienes la estructura (DDL — Data Definition Language):

CREATE TABLE log_analytics (
    log_id SERIAL PRIMARY KEY, -- Identificador único del registro
    report_name TEXT NOT NULL, -- Nombre del informe o métrica
    report_date DATE DEFAULT CURRENT_DATE, -- Fecha a la que corresponde el informe
    category TEXT, -- Categoría de los datos (por ejemplo, región, producto)
    metric_value NUMERIC NOT NULL, -- Valor de la métrica
    created_at TIMESTAMP DEFAULT NOW() -- Fecha y hora del registro
);
  • log_id: identificador principal del registro.
  • report_name: nombre del informe o métrica, por ejemplo, "Weekly Sales".
  • report_date: fecha a la que corresponde la métrica. Por ejemplo, si son ventas del 1 de octubre, aquí será 2023-10-01.
  • category: ayuda a agrupar los datos, por ejemplo, por regiones.
  • metric_value: valor numérico de la métrica del informe.
  • created_at: marca de tiempo del registro.

Ejemplo de inserción de datos en log_analytics

Supón que calculaste los ingresos de octubre para la región "Norte". ¿Cómo guardas ese valor?

INSERT INTO log_analytics (report_name, report_date, category, metric_value)
VALUES ('Monthly Revenue', '2023-10-01', 'North', 15000.75);

Resultado:

log_id report_name report_date category metric_value created_at
1 Monthly Revenue 2023-10-01 North 15000.75 2023-10-10 14:35:50

Creando un procedimiento para registrar datos

Obvio, no vamos a meter los datos a mano cada semana o mes. Así que vamos a automatizar el proceso con un procedimiento.

Vamos a crear un procedimiento sencillo para registrar datos de ingresos:

CREATE OR REPLACE FUNCTION log_monthly_revenue(category TEXT, revenue NUMERIC)
RETURNS VOID AS $$
BEGIN
    INSERT INTO log_analytics (report_name, report_date, category, metric_value)
    VALUES ('Monthly Revenue', CURRENT_DATE, category, revenue);
END;
$$ LANGUAGE plpgsql;

Ahora el procedimiento log_monthly_revenue recibe dos parámetros:

  • category: categoría de los datos, por ejemplo, región.
  • revenue: valor de los ingresos

Así llamas a esta función para registrar ingresos:

SELECT log_monthly_revenue('North', 15000.75);

El resultado será igual que si lo insertaras con INSERT.

Ideas extra para la estructura de logs

A veces la métrica clave no es solo una, sino varias a la vez. Veamos cómo guardar indicadores extra como número de pedidos o ticket medio.

Actualizamos la estructura de la tabla:

CREATE TABLE log_analytics_extended (
    log_id SERIAL PRIMARY KEY,
    report_name TEXT NOT NULL,
    report_date DATE DEFAULT CURRENT_DATE,
    category TEXT,
    metric_values JSONB NOT NULL, -- Guardar métricas en formato JSONB
    created_at TIMESTAMP DEFAULT NOW()
);

Aquí lo importante es el uso del tipo JSONB para guardar varias métricas en un solo campo.

Ejemplo de inserción en la tabla extendida

Supón que necesitas guardar tres métricas a la vez: ingresos, número de pedidos y ticket medio. Así sería el query:

INSERT INTO log_analytics_extended (report_name, category, metric_values)
VALUES (
    'Monthly Revenue',
    'North',
    '{"revenue": 15000.75, "orders": 45, "avg_check": 333.35}'::jsonb
);

Resultado:

log_id report_name category metric_values created_at
1 Monthly Revenue North {"revenue": 15000.75, "orders": 45, "avg_check": 333.35} 2023-10-10 14:35:50

Ejemplos de uso de logs: análisis de ingresos

Supón que quieres saber el ingreso total de todas las regiones en octubre. Aquí tienes el query:

SELECT SUM((metric_values->>'revenue')::NUMERIC) AS total_revenue
FROM log_analytics_extended
WHERE report_date BETWEEN '2023-10-01' AND '2023-10-31';

Ejemplos de uso de logs: tendencias por región

Analizamos cómo cambian los ingresos por región:

SELECT category, report_date, (metric_values->>'revenue')::NUMERIC AS revenue
FROM log_analytics_extended
ORDER BY category, report_date;

Manejo de errores típicos

Al registrar datos analíticos puedes cometer algunos errores. Vamos a hablar de ellos y cómo evitarlos.

  • Error: olvidaste indicar la categoría o la fecha. Se recomienda poner valores por defecto en la tabla, por ejemplo DEFAULT CURRENT_DATE.
  • Error: duplicación de registros. Para evitar duplicados, puedes añadir un índice único:
    CREATE UNIQUE INDEX unique_log_entry
    ON log_analytics (report_name, report_date, category);
    
  • Error: cálculo de métricas con división por cero. ¡Siempre revisa el divisor! Usa NULLIF:
    SELECT revenue / NULLIF(order_count, 0) AS avg_check FROM orders;
    

Aplicación en proyectos reales

El registro de datos analíticos es útil en muchos ámbitos:

  • Retail: seguimiento de ingresos y ventas por categorías de productos.
  • Servicios: análisis de carga de servidores o aplicaciones.
  • Finanzas: control de transacciones y gastos.

Estos datos te ayudarán no solo a explicar qué pasó, sino a tomar decisiones basadas en lo que ves en los logs. Ahora ya sabes cómo guardar el historial de datos analíticos en PostgreSQL. ¡Genial, te esperan aún más conocimientos útiles!

Comentarios
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION