dd_inventario_diario
0 bytes
Inventario diario al cierre por fecha, almacén y artículo.
Tabla de ~39 GB. Siempre filtrar por fecha antes de cualquier join.
Tamaño en disco
0 bytes
Columnas
| Columna | Tipo | Descripción |
|---|---|---|
| fecha 🔑 | date | |
| almacen_id 🔑 | bigint | |
| articulo_id 🔑 | bigint | |
| entradas_diarias | numeric(18,2)NOT NULL | |
| salidas_diarias | numeric(18,2)NOT NULL | |
| existencia_inicial | numeric(18,2)NOT NULL | |
| existencia_final | numeric(18,2)NOT NULL | |
| costo_total_entradas_diarias | numeric(18,2)NOT NULL | |
| costo_total_salidas_diarias | numeric(18,2)NOT NULL | |
| costo_total_inicial | numeric(18,2)NOT NULL | |
| costo_total_final | numeric(18,2)NOT NULL |
doctos_in
299 MB
Movimientos de inventario: entradas y salidas por concepto.
Tamaño en disco
299 MB
Filas estimadas
~2,092,713
Columnas
| Columna | Tipo | Descripción |
|---|---|---|
| docto_in_id | bigint | |
| almacen_id | bigint | |
| concepto_in_id | bigint | |
| fecha | timestamp | |
| almacen_destino_id | float8 | |
| centro_costo_id | float8 | |
| sucursal_id | bigint | |
| descripcion | text | |
| sistema_origen | text | |
| folio | text | |
| naturaleza_concepto | text | |
| cancelado | text | |
| usuario_creador | text | |
| fecha_hora_creacion | timestamp | |
| usuario_aut_creacion | text | |
| usuario_ult_modif | text | |
| fecha_hora_ult_modif | timestamp | |
| usuario_cancelacion | text |
traspasos_in
22 MB
Traspasos de mercancía entre almacenes.
Tamaño en disco
22 MB
Filas estimadas
~126,631
Columnas
| Columna | Tipo | Descripción |
|---|---|---|
| traspaso_in_id | bigint | |
| folio | text | |
| fecha | timestamp | |
| fecha_entrega | timestamp | |
| sucursal_origen_id | bigint | |
| almacen_origen_id | bigint | |
| sucursal_destino_id | bigint | |
| almacen_destino_id | bigint | |
| via_embarque_id | float8 | |
| docto_in_id | float8 | |
| descripcion | text | |
| estatus | text | |
| usuario_creador | text | |
| fecha_hora_creacion | timestamp | |
| usuario_ult_modif | text | |
| fecha_hora_ult_modif | timestamp | |
| fecha_hora_cancelacion | timestamp |
dd_ventas_diarias_articulos_omnicanal
0 bytes
Ventas consolidadas por canal, sin cancelaciones ni devoluciones.
Solo registros vigentes. Para ver devoluciones usar doctos_ve.
Tamaño en disco
0 bytes
Columnas
| Columna | Tipo | Descripción |
|---|---|---|
| ventaid | textNOT NULL | |
| canal | varchar(20)NOT NULL | |
| fecha | dateNOT NULL | |
| almacen_id | bigintNOT NULL | |
| folio | varchar(50)NOT NULL | |
| cliente_id | bigint | |
| articulo_id | bigintNOT NULL | |
| clave_articulo | varchar(50) | |
| unidades | numeric(14,4)NOT NULL | |
| venta_sin_iva | numeric(14,4)NOT NULL | |
| tipo_docto | char(1)NOT NULL |
doctos_ve
129 MB
Documentos de venta con todos los estatus, incluyendo cancelaciones.
Tamaño en disco
129 MB
Filas estimadas
~386,216
Columnas
| Columna | Tipo | Descripción |
|---|---|---|
| docto_ve_id | bigint | |
| tipo_docto | text | |
| subtipo_docto | text | |
| sucursal_id | bigint | |
| folio | text | |
| fecha | timestamp | |
| hora | timestamp | |
| clave_cliente | text | |
| cliente_id | bigint | |
| dir_cli_id | bigint | |
| dir_consig_id | bigint | |
| almacen_id | float8 | |
| lugar_expedicion_id | float8 | |
| moneda_id | bigint | |
| tipo_cambio | float8 | |
| tipo_dscto | text | |
| dscto_pctje | float8 | |
| dscto_importe | float8 | |
| estatus | text | |
| aplicado | text | |
| descripcion | text | |
| importe_neto | float8 | |
| fletes | float8 | |
| otros_cargos | float8 | |
| total_impuestos | float8 | |
| total_retenciones | float8 | |
| total_anticipos | float8 | |
| peso_embarque | float8 | |
| forma_emitida | text | |
| contabilizado | text | |
| acreditar_cxc | text | |
| sistema_origen | text | |
| cond_pago_id | bigint | |
| vendedor_id | float8 | |
| pctje_comis | float8 | |
| via_embarque_id | float8 | |
| importe_cobro | float8 | |
| usuario_creador | text | |
| es_cfd | text | |
| modalidad_facturacion | text | |
| uso_cfdi | text | |
| metodo_pago_sat | text | |
| fecha_hora_creacion | timestamp | |
| orden_compra | text |
doctos_cm
6312 kB
Documentos de compra: órdenes, recepciones y devoluciones.
Tamaño en disco
6312 kB
Filas estimadas
~27,756
Columnas
| Columna | Tipo | Descripción |
|---|---|---|
| dscto_importe | float8 | |
| importe_neto | float8 | |
| fletes | float8 | |
| otros_cargos | float8 | |
| total_impuestos | float8 | |
| total_retenciones | float8 | |
| gastos_aduanales | float8 | |
| otros_gastos | float8 | |
| docto_cm_id | bigint | |
| fecha | timestamp | |
| proveedor_id | bigint | |
| consig_cm_id | float8 | |
| almacen_id | bigint | |
| pedimento_id | float8 | |
| dscto_pctje | text | |
| fecha_entrega | timestamp | |
| sucursal_id | bigint | |
| descripcion | text | |
| tipo_docto | text | |
| folio | text | |
| folio_prov | text | |
| tipo_dscto | text | |
| estatus | text | |
| subtipo_docto | text | |
| factura_dev | text | |
| via_embarque_id | float8 | |
| moneda_id | bigint | |
| cond_pago_id | bigint | |
| folio_prov_aux | text |
almacenes
112 kB
Catálogo de almacenes y sucursales.
Usar siempre como CTE al inicio de queries que necesiten nombre de almacén.
Tamaño en disco
112 kB
Filas estimadas
~301
Columnas
| Columna | Tipo | Descripción |
|---|---|---|
| nombre_abrev | text | |
| almacen_id | bigint | |
| nombre | text | |
| ciudad_id | float8 | |
| fecha_hora_creacion | timestamp | |
| oculto | text | |
| calle | text | |
| codigo_postal | text | |
| nombre_calle | text | |
| num_exterior | text | |
| num_interior | text | |
| colonia | text | |
| poblacion | text | |
| referencia | text | |
| cuenta_almacen | text | |
| cuenta_costo_venta | text | |
| cuenta_ventas | text | |
| cuenta_dscto_ventas | text | |
| cuenta_compras | text | |
| cuenta_devol_ventas | text |
articulos
1008 kB
Catálogo maestro de artículos.
Tamaño en disco
1008 kB
Filas estimadas
~10,800
Columnas
| Columna | Tipo | Descripción |
|---|---|---|
| articulo_id | bigint | |
| linea_articulo_id | float8 | |
| nombre | text | |
| estatus | text | |
| peso_unitario | text |
articulos_clasificadores
3400 kB
Clasificadores de cadena de suministro por artículo.
Se actualiza constantemente. Usar LEFT JOIN para no perder artículos sin clasificar.
Tamaño en disco
3400 kB
Filas estimadas
~10,800
Columnas
| Columna | Tipo | Descripción |
|---|---|---|
| elemento_id | bigint | |
| 00_coleccion_checo | text | |
| 00_maja_descuentos_activos | text | |
| 01_categoria | text | |
| 02_subcategoria | text | |
| 03_clase | text | |
| 04_sku_padre | text | |
| 05_sku_padre_descripcion | text | |
| 06_sku_variante | text | |
| 07_sku_variante_descripcion | text | |
| 08_sku | text | |
| 09_sku_composicion | text | |
| 10_coleccion_de_lanzamiento | text | |
| 11_color | text | |
| 12_color_primario | text | |
| 13_tono | text | |
| 14_talla | text | |
| 15_tipo_de_compra | text | |
| 16_segmentacion | text | |
| 17_styletag | text | |
| 18_estacionalidad | text | |
| 19_patronaje | text | |
| 20_segmentos_tienda | text | |
| 21_tipos_de_tienda | text | |
| 22_marca | text | |
| 23_temporada | text | |
| 24_tipo | text | |
| 25_estatus_de_producto | text | |
| 26_fit | text | |
| familia | text | |
| genero | text | |
| subcategoria | text |
Extensiones
analisis_maja
Herramientas instaladas en PostgreSQL que amplían las capacidades de la base de datos.
pg_cron corre como proceso interno de PostgreSQL. Los jobs se definen en SQL y se administran directamente desde analisis_maja, sin tocar el servidor ni el crontab del OS.
Configuración requerida
shared_preload_libraries
'pg_cron'cron.database_name
'analisis_maja'Schema del catálogo
cron — se crea al instalar la extensiónResolución mínima
1 minuto
Ejecución en paralelo
Sí — jobs independientes
Historial
cron.job_run_details
Activo en
Solo el servidor primario
Estructura de la expresión
┌─────── minuto (0–59)
│ ┌───── hora (0–23)
│ │ ┌─── día del mes (1–31)
│ │ │ ┌─ mes (1–12)
│ │ │ │ ┌ día semana (0–7, 0=domingo)
│ │ │ │ │
* * * * *
0 5 * * *Todos los días a las 5:00 am
30 4 * * *Todos los días a las 4:30 am
0 3 * * 0Domingos a las 3:00 am
*/30 * * * *Cada 30 minutos
0 7 * * 1-5Lunes a viernes a las 7:00 am
cron.schedule()
SELECT cron.schedule(
'etl_ventas_omnicanal_sp', '30 4 * * *',
$$CALL sp_dd_ventas_diarias_articulos_omnicanal()$$
);
cron.unschedule()
SELECT cron.unschedule('etl_ventas_omnicanal_sp');
Queries de administración
-- Ver todos los jobs
SELECT jobid, jobname, schedule, active FROM cron.job ORDER BY jobname;
-- Últimas 20 ejecuciones
SELECT j.jobname, r.status, r.start_time::time(0) AS inicio,
ROUND(EXTRACT(EPOCH FROM(r.end_time-r.start_time))) AS seg
FROM cron.job_run_details r
JOIN cron.job j ON j.jobid = r.jobid
ORDER BY r.start_time DESC LIMIT 20;
Jobs activos recomendados
SELECT cron.schedule('etl_ventas_omnicanal_sp', '30 4 * * *', $$CALL sp_dd_ventas_diarias_articulos_omnicanal()$$);
SELECT cron.schedule('etl_inventario_snapshot_sp', '0 5 * * *', $$CALL sp_dd_inventario_diario()$$);
SELECT cron.schedule('maint_inventario_vacuum', '0 3 * * 0', $$VACUUM ANALYZE dd_inventario_diario$$);
Próxima extensión por documentar.
Queries eficientes con CTEs
SQLPatrones recomendados para consultar las tablas grandes de MAJA sin degradar el rendimiento.
Patrón base: filtrar primero, enriquecer después
-- ✅ Correcto: filtrar en CTE, luego JOIN
WITH inv AS (
SELECT fecha, almacen_id, articulo_id, existencia_final
FROM dd_inventario_diario
WHERE fecha = '2024-12-31' AND almacen_id IN (1,5,10)
)
SELECT i.fecha, art.nombre, i.existencia_final
FROM inv i
LEFT JOIN articulos art ON i.articulo_id = art.articulo_id;
DISTINCT ON: snapshot del último registro
SELECT DISTINCT ON (almacen_id, articulo_id)
fecha, almacen_id, articulo_id, existencia_final
FROM dd_inventario_diario
WHERE fecha >= current_date - 7
ORDER BY almacen_id, articulo_id, fecha DESC;
Conexión desde Python
SQLAlchemypython-dotenvCómo conectarte a analisis_maja desde Python usando variables de entorno.
Las credenciales te serán enviadas por Slack o correo corporativo. Nunca las subas a un repositorio.
# .env
DB_URI=postgresql+psycopg2://usuario:password@host:5432/analisis_maja
import os, polars as pl
from dotenv import load_dotenv
from sqlalchemy import create_engine
load_dotenv()
engine = create_engine(os.getenv("DB_URI"))
df = pl.read_database(
query="SELECT * FROM dd_inventario_diario WHERE fecha = current_date - 1",
connection=engine
)
print(df.head())
pg_cron — Recomendaciones
Best practicesGuía práctica para operar pg_cron de manera segura en analisis_maja.
Convención de nombres
-- {categoria}_{tabla/proceso}_{accion}
'etl_ventas_omnicanal_sp'
'maint_inventario_vacuum'
'refresh_mv_inventario'
Ventanas seguras
ETL
3:00 am – 6:00 am
Mantenimiento
Sáb/Dom 1:00 am – 4:00 am
⚠️ Evitar
8:00 am – 10:00 am (pico de reportes)
Nunca programes VACUUM FULL vía pg_cron. Usa siempre
VACUUM ANALYZE.