muchas gracias!!!! realmente valioso tu aporte! voy a probarla.👍

Date: Tue, 22 Oct 2013 12:32:43 -0300
Subject: [pgsql-es-ayuda] Re: [pgsql-es-ayuda] RE: [pgsql-es-ayuda] Re: 
[pgsql-es-ayuda] Consulta SQL resta de 2 fechas en el mismo campo en distinto 
registro. (con condición especial)
From: walter.catteb...@gmail.com
To: pgsql-es-ayuda@postgresql.org

Hola de nuevo

Haciendo el mismo ejercicio pude extender la consulta para que coloque el 
inicio y el fin en el mismo registro.

Asumiendo que tienes una tabla llamada mi_tabla puedes crear una vista con el 
primer query que pase...


create view mi_vista as 
select t.id, t.estado, t.fecha from (

select id, estado, fecha, 
case
when estado = 'fin' and lead(estado) over w = 'inicio' then fecha
when estado = 'fin' and lead(estado) over w is null then fecha
when estado = 'inicio' and lag(estado) over w = 'fin' then fecha


when estado = 'inicio' and lag(estado) over w is null then fecha
else null end as ini_fin 
from mi_tabla window w as (order by fecha)
) t
 where t.ini_fin is not null

Con esta vista puedes ejecutar esta nueva consulta similar a la anterior...

select t.id, t.fin, t.inicio from (

select id, estado, fecha, 
case
when estado = 'inicio' then lead(fecha) over w
else null end as fin,
case
when estado = 'inicio' then fecha 
else null end as inicio
from mi_vista window w as (order by fecha)

) t
 where t.inicio is not null

que te dará este resultado...

 id |         fin         |       inicio
----+---------------------+---------------------

  1 | 2013-01-01 10:00:00 | 2013-01-01 08:00:00
  1 | 2013-01-01 13:40:00 | 2013-01-01 13:00:00
  1 | 2013-01-01 15:40:00 | 2013-01-01 14:00:00


Deberías analizar si te sirve en terminos de rendimiento pero cumple tu pedido 
de ser una consulta SQL.



Saludos,
Walter





2013/10/22 Walter Cattebeke <walter.catteb...@gmail.com>

Hola 

Esto se puede solucionar con funciones de ventana.

Te recomiendo leer este articulo 
http://tapoueh.org/blog/2012/10/05-reset-counter

alli se explica un problema que presenta similitudes con el tuyo.
Modificando un poco ese ejemplo consegui este query...

select t.id, t.estado, t.fecha from (


select id, estado, fecha, 
case
when estado = 'fin' and lead(estado) over w = 'inicio' then fecha
when estado = 'fin' and lead(estado) over w is null then fecha
when estado = 'inicio' and lag(estado) over w = 'fin' then fecha


when estado = 'inicio' and lag(estado) over w is null then fecha
else null end as ini_fin 
from mi_tabla window w as (order by fecha)
) t
 where t.ini_fin is not null



que te da este resultado...

 id | estado |        fecha
----+--------+---------------------
  1 | inicio | 2013-01-01 08:00:00
  1 | fin    | 2013-01-01 10:00:00


  1 | inicio | 2013-01-01 13:00:00
  1 | fin    | 2013-01-01 13:40:00
  1 | inicio | 2013-01-01 14:00:00
  1 | fin    | 2013-01-01 15:40:00

Eliminando los registros intermedios. A partir de ahi podrias usar crosstab o 
seguir con las funciones de ventana.



Saluds,
Walter



2013/10/22 Pelluco Pelluco <pellu...@hotmail.com>





Muchas gracias por la respuesta, sobre el diseño esta descartado, no puedo 
modificarlo.
Sobre el inicio y el fin.. la lógica es esta:


Se tomar el primer inicio luego se buscar el ultimo fin antes de un inicio, 
luego se repite el ciclo.Pensaba que algo se podía hacer el sql. 


Pude crear algo así: (tiene un par de funciones de sql server, pero eso era 
solo para una prueba.Esto me deja en un registro el inicio y el fin, pero no me 
soluciona el problema que exista un segundo fin luego del anterior.


SELECT DISTINCT    CONVERT(VARCHAR(10),s.date, 103) AS fecha,     (SELECT     
MIN(CONVERT(VARCHAR(5),x.date,108))

  FROM TABLA_Datos as x   where   estado in('Inicio') and 
CONVERT(VARCHAR(10),x.date, 103)   = CONVERT(VARCHAR(10),s.date, 103)) as 
encendido,  (SELECT  

 MAX(CONVERT(VARCHAR(5),x.date,108))  FROM TABLA_Datos as x   where   estado 
in('Fin') and CONVERT(VARCHAR(10),x.date, 103)   = CONVERT(VARCHAR(10),s.date, 
103)) as apagado

  FROM FROM TABLA_Datos as s  where   estado in('Inicio')  and   date BETWEEN  
'20130601' AND '20131230'    and id= 61  GROUP BY date 



Muchas gracias.

Date: Tue, 22 Oct 2013 09:26:37 -0500
Subject: [pgsql-es-ayuda] Re: [pgsql-es-ayuda] Consulta SQL resta de 2 fechas 
en el mismo campo en distinto registro. (con condición especial)


From: miguel.hdz....@gmail.com
To: mario...@gmail.com
CC: npola...@cuij.edu.cu; pgsql-es-ayuda@postgresql.org



Buenos días
Probablemente puedas hacer algo con consultas anidadas, pero como sabes que 
inició y que final van juntos, te falta un Id para distinguir el agrupamiento, 
lo único que podrías hacer es una función que los ordene primero los inicio y 
luego los finales y tomar uno x uno y ordenarlos manual



Por qué con eso de que todos los id son 1 y la premisa es de que la mitad es 
inició y la otra mitad es fin pudiera aplicar
Pero cúrate de males y haz lo que te comento el compañero, es inpractico el 
diseño así!



Saludos

El martes, 22 de octubre de 2013, Pelluco Pelluco  escribió:



muchas gracias por la respuesta, pero te comento que el diseño ya venia así, 
esto se registra a través de una maquina y no puedo entrar a modificarlo, es 
por eso que me gustaría saber si se puede realizar una consulta que lo pueda 
calcular.



graciasPedro.

Date: Tue, 22 Oct 2013 09:53:42 -0400
From: npola...@cuij.edu.cu

To: pgsql-es-ayuda@postgresql.org
Subject: [pgsql-es-ayuda] Re: [pgsql-es-ayuda] Consulta SQL resta de 2 fechas 
en el mismo campo en distinto registro. (con condición especial)



  
    
  
  
    ¿por qué ese diseño, no sería mejor:?

    

    id - fecha - hora_inicio - hora_fin

    

    No sé, digo yo, me parece que es más fácil cualquier operación y
    hasta más lógico el diseño.

    

    

    On 22/10/13 08:42, Pelluco Pelluco
      wrote:

    
    
      
      
        
          Hola,
            estimados compañeros tengo una duda sobre si se puede hacer
            o no una consulta con las sgtes caracteristicas:
          con
            una tabla perecida a esta:
          id
            - Fecha - Estado
          1
            - 01-01-2013 08:00 - inicio
          1
            - 01-01-2013 10:00 - fin
          1
            - 01-01-2013 13:00 - inicio
          1
            - 01-01-2013 13:30 - fin
          1
            - 01-01-2013 13:40 - fin
          1
            - 01-01-2013 14:00 - inicio
          1
            - 01-01-2013 14:30 -  inicio
          1
            - 01-01-2013 15:40  - fin
          La
            idea es poder restar las horas entre el primer inicio y el
            ultimo fin (por cada inicio) por ejemplo en este caso
            quedaria
          10:00
            - 08:00
          13:40
            - 13:00
          15:40
            - 14:00
          Se
            puede hacer por consulta?
          

          
          Muchas
            Gracias.
        
      
    
    
                                          


-- 
ISC Miguel Angel Hernandez Moreno

                                          



                                          

Responder a