Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Oracle »

crear columna en base a otra en consulta

Estas en el tema de crear columna en base a otra en consulta en el foro de Oracle en Foros del Web. la consulta un campo Carga y uno fecha hago la consulta ordena por la Carga que es un numero. Ej. del resultado: Carga Fecha 4558 ...
  #1 (permalink)  
Antiguo 07/02/2008, 08:28
 
Fecha de Ingreso: junio-2007
Mensajes: 66
Antigüedad: 16 años, 10 meses
Puntos: 0
crear columna en base a otra en consulta

la consulta un campo Carga y uno fecha hago la consulta ordena por la Carga que es un numero. Ej. del resultado:

Carga Fecha

4558 01.02.2008
4558 01.02.2008
4559 02.02.2008
4560 02.02.2008
4561 03.02.2008
4561 03.02.2008
4562 04.02.2008

Lo que tengo que hacer es otra columna llamada Error que no esta en la tabla que realiza una operacion aritmetica que sería lo siguiente:

fila(i) - fila(i-1), es decir, restar sucesor con el antecesor. El primer valor de la fila no cacho como hacerlo, pero

Debería quedar algo como esto:

Carga Fecha Error (fila(i)-fila(i-1))

4558 01.02.2008
4558 01.02.2008 0
4559 02.02.2008 1
4564 02.02.2008 5
4565 03.02.2008 1
4565 03.02.2008 0
4566 04.02.2008 1


Se puede hacer algo como esto.

De antemano muchas gracias
  #2 (permalink)  
Antiguo 07/02/2008, 10:22
 
Fecha de Ingreso: noviembre-2007
Ubicación: Argentina
Mensajes: 134
Antigüedad: 16 años, 5 meses
Puntos: 3
Re: crear columna en base a otra en consulta

Victor, es muy simple lo que necesitas, se puede hacer usando el feature de oracle para partitions de scripts.

Primero creamos una tabla:
Código:
DROP TABLE TABLE_VICTOR PURGE;

CREATE TABLE TABLE_VICTOR TABLESPACE AUXILIAR PCTFREE 5 PCTUSED 95 AS 
SELECT CARGA, FECHA FROM ( 
SELECT 4558 CARGA, TO_DATE('01.02.2008','DD.MM.YYYY') FECHA FROM DUAL UNION ALL
SELECT 4558 CARGA, TO_DATE('01.02.2008','DD.MM.YYYY') FECHA FROM DUAL UNION ALL
SELECT 4559 CARGA, TO_DATE('02.02.2008','DD.MM.YYYY') FECHA FROM DUAL UNION ALL
SELECT 4560 CARGA, TO_DATE('02.02.2008','DD.MM.YYYY') FECHA FROM DUAL UNION ALL
SELECT 4561 CARGA, TO_DATE('03.02.2008','DD.MM.YYYY') FECHA FROM DUAL UNION ALL
SELECT 4561 CARGA, TO_DATE('03.02.2008','DD.MM.YYYY') FECHA FROM DUAL UNION ALL
SELECT 4562 CARGA, TO_DATE('04.02.2008','DD.MM.YYYY') FECHA FROM DUAL
);
Una vez creada la tabla, corremos el siguiente select:
Código:
SELECT CARGA,
       FECHA,
       CARGA - CARGA_ANTERIOR ERROR
  FROM (SELECT CARGA,
               FECHA,
               LAG(CARGA,1) OVER(ORDER BY CARGA) CARGA_ANTERIOR
          FROM TABLE_VICTOR
       );
La funcion de windowing LAG es la que mas se ajusta a tus necesidades, en una columna adicional ejecuta el calculo de desplazamiento del campo carga, permitiendo hacer la resta y saber la diferencia a la que tu llamas error.

Bueno, muchos exitos.
Sldo Atte, Mario.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta

SíEste tema le ha gustado a 1 personas




La zona horaria es GMT -6. Ahora son las 20:30.