Re: Restar dos campos de tipo fecha de distintos registros

From: Alberto Cuevas <betocuevas(dot)net(at)gmail(dot)com>
To: Anthony Sotolongo <asotolongo(at)gmail(dot)com>
Cc: "pgsql-es-ayuda(at)postgresql(dot)org" <pgsql-es-ayuda(at)postgresql(dot)org>
Subject: Re: Restar dos campos de tipo fecha de distintos registros
Date: 2016-04-29 04:27:43
Message-ID: CA+mENxqqQvWqis2Tr3rUjEPBz3xJUwGBHXmGkuXhbFf9ysUwqQ@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

Anthony muchas gracias por responder, NVL es una función de Oracle,
actualmente trabajo con 2 motores Oracle para el sistema antiguo y
PostgreSQL para el sistema nuevo al cual se esta migrando todo y pues la
prueba la hice en Oracle.

Voy a leer mas sobre LEAD, si alguien tiene un ejemplo por favor comparta
que me seria de mucha utilidad.

Saludos.

El 28 de abril de 2016, 21:02, Anthony Sotolongo <asotolongo(at)gmail(dot)com>
escribió:

> Alberto, ¿te fijaste en la doc que a la función ventana lead() le puedes
> indicar otros atributos para que devuelva un resultado u otro(offset y
> default value)?
>
> lead(value anyelement [,offset integer [, defaultanyelement ]])
>
> tal vez eso te pueda ayudar con lo que quieres
>
> Esa Función NVL es desarrollada por ti o estas usando una extensión o
> producto distinto a PostgreSQL Comunitario? pues la verdad no la recuerdo
> :( ,
>
>
> Saludos
>
>
>
> El 4/28/2016 a las 8:06 PM, Alberto Cuevas escribió:
>
> Hola nuevamente, gracias por el apoyo brindado pude obtener lo que queria
> con funcion de ventana, pero esto mismo necesito aplicar pero a otro caso.
>
> Tengo una tabla con una estructura similar a esto:
>
> | COD_PER | COD_INSC | FEC_INICIAL | FEC_FINAL | | 011650 | 0054010 |
> 16/01/2015 | 16/01/2015 | | 011650 | 0054010 | 01/01/2015 | 16/01/2015 | |
> 011650 | 0054010 | 01/10/2014 | 01/01/2015 | | 011650 | 0054010 |
> 01/07/2014 | 01/10/2014 | | 011650 | 0054010 | 01/04/2014 | 01/07/2014 | |
> 011650 | 0054010 | 01/02/2014 | 01/04/2014 | | 011650 | 0054010 |
> 01/01/2014 | 01/02/2014 | | 011650 | 0054010 | 01/10/2013 | 01/01/2014 | |
> 011650 | 0054010 | 17/07/2013 | 01/10/2013 |
> Utilice:
>
> LEAD(S.FEC_FIN) OVER (ORDER BY S.COD_PER ASC, S.FEC_FIN DESC) AS FEC_FINAL,
> NVL(ABS(S.FEC_INI - LEAD(S.FEC_FIN) OVER (ORDER BY S.COD_PER ASC, S.NRO
> DESC)), 0) AS DIAS,
> ROW_NUMBER() OVER (PARTITION BY S.COD_PER ORDER BY S.COD_PER ASC,
> S.COD_INSC DESC) AS ITEM
>
> Y obtuve esto:
>
> | COD_PER | COD_INSC | FEC_INICIAL | FEC_FINAL | DIAS | ITEM | | 011650 |
> 0054010 | 16/01/2015 | 16/01/2015 | 0 | 1 | | 011650 | 0054010 | 01/01/2015
> | 01/01/2015 | 0 | 2 | | 011650 | 0054010 | 01/10/2014 | 01/10/2014 | 0 | 3
> | | 011650 | 0054010 | 01/07/2014 | 01/07/2014 | 0 | 4 | | 011650 | 0054010
> | 01/04/2014 | 01/04/2014 | 0 | 5 | | 011650 | 0054010 | 01/02/2014 |
> 01/02/2014 | 0 | 6 | | 011650 | 0054010 | 01/01/2014 | 01/01/2014 | 0 | 7 |
> | 011650 | 0054010 | 01/10/2013 | 01/10/2013 | 0 | 8 | | 011650 | 0054010 |
> 17/07/2013 | | 0 | 9 |
> Las pruebas solo las hice con el COD_PER 011650, pero cuando quiero de
> todos los codigos pues observe lo siguiente:
>
> | COD_PER | COD_INSC | FEC_INICIAL | FEC_FINAL | DIAS | ITEM | | 011650 |
> 0054010 | 16/01/2015 | 16/01/2015 | 0 | 1 | | 011650 | 0054010 | 01/01/2015
> | 01/01/2015 | 0 | 2 | | 011650 | 0054010 | 01/10/2014 | 01/10/2014 | 0 | 3
> | | 011650 | 0054010 | 01/07/2014 | 01/07/2014 | 0 | 4 | | 011650 | 0054010
> | 01/04/2014 | 01/04/2014 | 0 | 5 | | 011650 | 0054010 | 01/02/2014 |
> 01/02/2014 | 0 | 6 | | 011650 | 0054010 | 01/01/2014 | 01/01/2014 | 0 | 7 |
> | 011650 | 0054010 | 01/10/2013 | 01/10/2013 | 0 | 8 | | 011650 | 0054010 |
> 17/07/2013 | 31/10/2015 | 836 | 9 | | 011658 | 0072885 | 31/10/2015 |
> 31/10/2015 | 0 | 1 | | 011658 | 0072885 | 01/10/2015 | 01/10/2015 | 0 | 2 |
> | 011658 | 0072885 | 01/09/2015 | 01/09/2015 | 0 | 3 | | 011658 | 0072885 |
> 01/07/2015 | 01/07/2015 | 0 | 4 | | 011658 | 0072885 | 01/06/2015 |
> 01/06/2015 | 0 | 5 | | 011658 | 0072885 | 01/05/2015 | 01/05/2015 | 0 | 6 |
>
>
> Que en el siguiente registro se esta restando FEC_FINAL del COD_PER 011658
> con FEC_INICIAL del COD_PER 011650, lo cual no debe ser:
>
> | 011650 | 0054010 | 17/07/2013 | 31/10/2015 | 836 | 9 |
>
>
> Hay forma de que por cada codigo la ultima FEC_INICIAL quede vacia por
> cada COD_PER
>
>
> Y solo reste las fechas FEC_INICIAL y FEC_FINAL por cada COD_PER y quede
> algo asi:
>
>
> | 011650 | 0054010 | 01/01/2014 | 01/01/2014 | 0 | 7 |
> | 011650 | 0054010 | 01/10/2013 | 01/10/2013 | 0 | 8 |
> | 011650 | 0054010 | 17/07/2013 |
> | 0 | 9 |
> | 011658 | 0072885 | 31/10/2015 | 31/10/2015 | 0 | 1 |
> | 011658 | 0072885 | 01/10/2015 | 01/10/2015 | 0 | 2 |
> | 011658 | 0072885 | 01/09/2015 | 01/09/2015 | 0 | 3 |
>
>
>
>
>
>
>
> Gracias por su ayuda.
>
>
>
>
>
>
>
>
>
>
>
>
> El lun., 18 abr. 2016 a las 21:33, mauricio pullabuestan (<
> jmauriciopb(at)yahoo(dot)es>) escribió:
>
>> Hola Alberto.
>>
>>
>> Como dice Hellmuth usa funciones de ventana, es lo mejor.
>>
>> Puse el ejemplo de Hellmuth en este link
>> http://sqlfiddle.com/#!15/71cbd/1
>>
>> Espero no se moleste.
>> Saludos.
>>
>> Mauricio.
>>
>
>

In response to

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Jaime Casanova 2016-05-02 16:46:44 Re: Restar dos campos de tipo fecha de distintos registros
Previous Message Anthony Sotolongo 2016-04-29 02:02:49 Re: Restar dos campos de tipo fecha de distintos registros