Cordial Saludo.

Tengo una sentencia de este tipo (dentro de una función):

****************************************************************************************************************
SELECT          COALESCE(salinv.id_parte, mov.id_parte) AS id_parte,
                        COALESCE(salinv.codigo_parte, mov.codigo_parte) AS 
codigo_parte,
                        COALESCE(salinv.serial_parte, mov.serial_parte) AS 
serial_parte,
COALESCE(salinv.descripcion_parte, mov.descripcion_parte) AS descripcion_parte, COALESCE(salinv.descripcion_tipoparte, mov.descripcion_tipoparte) AS descripcion_tipoparte,
                        COALESCE(salinv.id_almacen, mov.id_almacen) AS 
id_almacen,
                        COALESCE(salinv.codigo_almacen, mov.codigo_almacen) AS 
codigo_almacen,
COALESCE(salinv.descripcion_almacen, mov.descripcion_almacen) AS descripcion_almacen,
                        COALESCE(salinv.id_localizacion, mov.id_localizacion) 
AS id_localizacion,
COALESCE(salinv.codigo_localizacion, mov.codigo_localizacion) AS codigo_localizacion, COALESCE(salinv.descripcion_localizacion, mov.descripcion_localizacion) AS descripcion_localizacion,
                        COALESCE(anno_salinvmes, 0::smallint) AS anno_salinvmes,
                        COALESCE(mes_salinvmes, 0::smallint) AS mes_salinvmes,
                        COALESCE(qreal_salinvmes, 0) AS qreal_salinvmes,
                        COALESCE(qcomprometida_salinvmes, 0) AS 
qcomprometida_salinvmes,
                        COALESCE(qtransito_salinvmes, 0) AS qtransito_salinvmes,
                        COALESCE(qreal2_salinvmes, 0) AS qreal2_salinvmes,
                        id_movimiento,
                        fecha_movimiento,
                        id_transac,
                        codigo_transac,
                        descripcion_transac,
                        id_dtransac,
                        id_traninve,
                        codigo_traninve,
                        descripcion_traninve,                   campo_almacen,
                        id_tipodocumento,
                        descripcion_tipodocumento,
                        documento_movimiento,
                        itemdocu_movimiento,
                        id_tercero,
                        id_tipoidentificacion,
                        documento_tercero,
                        nombres_tercero,
                        apellido1_tercero,
                        apellido2_tercero,
                        iduser,
                        id_unidad,
                        descripcion_unidad,
                        afectavalor_traninve,
                        signoreal,
                        signocomp,
                        signotran,
                        signoreal2,
                        cantidad_movimiento,
                        cantidadreal,
                        cantidadcomp,
                        cantidadtran,
                        cantidadreal2,
                        ts,
COALESCE(qreal_salinvmes, 0) + sum(cantidadreal) OVER (PARTITION BY COALESCE(salinv.id_parte, mov.id_parte), COALESCE(salinv.id_almacen, mov.id_almacen), COALESCE(salinv.id_localizacion, mov.id_localizacion) ORDER BY fecha_movimiento) AS saldoreal, COALESCE(qcomprometida_salinvmes, 0) + sum(cantidadcomp) OVER (PARTITION BY COALESCE(salinv.id_parte, mov.id_parte), COALESCE(salinv.id_almacen, mov.id_almacen), COALESCE(salinv.id_localizacion, mov.id_localizacion) ORDER BY fecha_movimiento) AS saldocomp, COALESCE(qtransito_salinvmes, 0) + sum(cantidadtran) OVER (PARTITION BY COALESCE(salinv.id_parte, mov.id_parte), COALESCE(salinv.id_almacen, mov.id_almacen), COALESCE(salinv.id_localizacion, mov.id_localizacion) ORDER BY fecha_movimiento) AS saldortran, COALESCE(qreal2_salinvmes, 0) + sum(cantidadreal2) OVER (PARTITION BY COALESCE(salinv.id_parte, mov.id_parte), COALESCE(salinv.id_almacen, mov.id_almacen), COALESCE(salinv.id_localizacion, mov.id_localizacion) ORDER BY fecha_movimiento) AS saldoreal2
        FROM            salinvmesinicial($1) salinv
                        FULL JOIN movimientoview mov ON salinv.id_parte = 
mov.id_parte
                                AND salinv.id_almacen = mov.id_almacen
                                AND salinv.id_localizacion = mov.id_localizacion
        WHERE           mov.fecha_movimiento >= primeromes($1)
                                AND mov.fecha_movimiento < $1 + 1
        ORDER BY        id_parte, id_almacen, id_localizacion, 
mov.fecha_movimiento****************************************************************************************************************

Centrándonos en los últimos 4 campos de resultado, utilizan funciones de ventana para ir haciendo una suma incremental particionando por id_parte, id_almacen y id_localizacion algo así como un running total. Leyendo la documentación me dice que debo utilizar un ORDER BY para modificar el frame del window y así poder realizar estas sumas incrementales ... por ahora he utilizado el campo fecha_movimiento como ordenamiento pero tengo el problema de que cuando varios movimientos tienen la misma fecha, utiliza todos los registros con la misma fecha como frame ... lo que quisiera es que el frame sea cada registro pero no puedo utilizar otro campo(s) como ORDER BY de la ventana ya que necesito que vayan sumándose por fecha_movimiento tal como esta el ORDER BY general. Tal como esta en este momento el performace es MUY similar con y sin las window functions, me imagino que es gracias a que se utiliza el mismo ordenamiento general de la sentencia, por esta razón no quisiera modificar el ordenamiento de la ventana generando perjuicios en el performance de la sentencia.

NOTA: fecha_movimiento es del tipo timestamp y funciona como una timestamp pero podría tener la misma fecha/hora si los movimientos se realizaron dentro de una misma transacción.

Alguna sugerencia? Alguna alternativa diferente a window functions?

Atentamente,

RAUL DUQUE
Bogotá, Colombia


__________ Information from ESET NOD32 Antivirus, version of virus signature 
database 5131 (20100520) __________

The message was checked by ESET NOD32 Antivirus.

http://www.eset.com



-
Enviado a la lista de correo pgsql-es-ayuda ([email protected])
Para cambiar tu suscripción:
http://www.postgresql.org/mailpref/pgsql-es-ayuda

Responder a