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.[image: Emoji] > 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. > > gracias > Pedro. > > ------------------------------ > 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 > >