Re: Tiempo entre cambio de valores

From: Anthony Sotolongo <asotolongo(at)gmail(dot)com>
To: ocascante(at)opensoftwarecr(dot)com, "Guillermo E(dot) Villanueva" <guillermovil(at)gmail(dot)com>
Cc: pgsql-es-ayuda <pgsql-es-ayuda(at)lists(dot)postgresql(dot)org>
Subject: Re: Tiempo entre cambio de valores
Date: 2021-03-21 21:21:59
Message-ID: 4156e406-3146-3e99-58a6-c2080db00420@gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

Hola nuevamente, la solución sería entonces como te comenta Juan José,
usando window functions, en este caso lead

create table tabla_ejemplo (ts timestamp, err int, deviceid text);

insert into tabla_ejemplo values
('2021-03-04 16:29:15.538263-06' , 10000 , '1d993kld00dl303'),
('2021-03-04 16:29:27.770273-06' , 20000 , '1d993kld00dl303'),
('2021-03-04 16:30:27.690168-06' , 10050 , '1d993kld00dl303'),
('2021-03-04 16:31:31.729803-06' , 10000 , '1d993kld00dl303'),
('2021-03-04 16:35:31.729803-06' , 20000 , '1d993kld00dl303');

select
deviceid,
err,
coalesce(-(ts - lead(ts) over(partition by deviceid order by ts)),
-(ts-now())) as tiempo_cambio
from tabla_ejemplo;

    deviceid     |  err  |     tiempo_cambio
-----------------+-------+------------------------
 1d993kld00dl303 | 10000 | 00:00:12.23201
 1d993kld00dl303 | 20000 | 00:00:59.919895
 1d993kld00dl303 | 10050 | 00:01:04.039635
 1d993kld00dl303 | 10000 | 00:04:00
 1d993kld00dl303 | 20000 | 17 days 01:44:05.57738
(5 rows)

Saludos

On 3/20/21 11:53 AM, ocascante(at)opensoftwarecr(dot)com wrote:
>
> Hola Guillermo, este es un ejemplo de los registros sobre los que debo
> ejecutar el query:
>
> Timestamp - Codigo de error - Device ID
>
> 2021-03-04 16:29:15.538263-06 | 10000 | 1d993kld00dl303
> 2021-03-04 16:29:27.770273-06 | 20000 | 1d993kld00dl303
> 2021-03-04 16:30:27.690168-06 | 10050 | 1d993kld00dl303
> 2021-03-04 16:31:31.729803-06 | 10000 | 1d993kld00dl303
> 2021-03-04 16:35:31.729803-06 | 20000 | 1d993kld00dl303
>
> Sobre estos datos, necesito sabe cuanto tiempo estuvo activo cada
> error, viendo estos datos sería:
>
> Error 10000 tiempo 12 segundos
> Error 20000 tiempo 1 minutos
> Error 10050 tiempo 1 minuto y 4 segundos
> Error 10000 tiempo 4 minutos
> Error 20000 tiempo: este debería calcularse en base a el tiempo en que
> se ejecuta la consulta ya que no existe un nuevo registro en base al
> cual calcularlo.
>
> Saludos
>
>
> "Guillermo E. Villanueva" <guillermovil(at)gmail(dot)com
> <mailto:guillermovil(at)gmail(dot)com>> escribió:
>
>> Danos un ejemplo de unos cuantos valores de la tabla y de la salida
>> que quieras que tenga tu consulta
>>
>> El mar, 16 mar 2021 a las 15:40, <ocascante(at)opensoftwarecr(dot)com
>> <mailto:ocascante(at)opensoftwarecr(dot)com>> escribió:
>>
>> _Hola Antonio y Juan,
>>
>> Les explico un poco más, yo envío desde un dispositivo el
>> siguiente registro:
>>
>> <timestamp> <device ID > <errorcode>
>>
>> solamente tres campos donde se registra un error perteneciente a
>> un device id, el timestamp es automático de postgresql.
>>
>> Entonces yo necesito un sql que me calcule el tiempo en que tardo
>> cada error en cambiar. Es decir, cuanto tiempo estuvo en error 1,
>> cuanto en error 2, etc.
>>
>> Saludos.
>>
>> Anthony Sotolongo <asotolongo(at)gmail(dot)com
>> <mailto:asotolongo(at)gmail(dot)com>> escribió:
>>
>> > Cierto Juan..., por algun motivo interpreté que hacia update de
>> > atributo Estado
>> >
>> >
>> > Saludos
>> >
>> > On 3/5/21 9:49 AM, Juan José Santamaría Flecha wrote:
>> >>
>> >> On Fri, Mar 5, 2021 at 4:29 AM Anthony Sotolongo
>> >> <asotolongo(at)gmail(dot)com <mailto:asotolongo(at)gmail(dot)com>
>> <mailto:asotolongo(at)gmail(dot)com>>
>> <mailto:asotolongo(at)gmail(dot)com%3E%3E> wrote:
>> >>
>> >>    Hola, si en el atributo Time guardas el momento(timestamp)
>> en que
>> >>    cambió
>> >>    de estado, puedes implementar un mecanismo de trigger que
>> >>    registre, el
>> >>    cambio de estado y el tiempo que estuvo, en otra tabla, o
>> también
>> >>    puedes implementar algun otro mecanismo de versionado de
>> registros y
>> >>    calcular la diferencia de tiempo.
>> >>
>> >>    > Existe algún sql donde yo pueda ver cuanto tiempo tiene cada
>> >>    valor? Es
>> >>    > decir, cuanto tiempo estuvo en 0 hasta pasar a 1, cuanto
>> a 1 hasta
>> >>    > pasar a 0.
>> >>
>> >>
>> >> Juraría que la información que quieres sacar es:
>> >>
>> >> select
>> >> Dispositivo,
>> >> Time,
>> >> Estado,
>> >> coalesce(Time - lag(Time) over(partition by Dispositivo order by
>> >> Time), '0 day'::interval) as cambio
>> >> from tabla_iot;
>> >>
>> >>  Un saludo,
>> >>
>> >> Juan José Santamaría Flecha
>> >>_
>>
>
>

In response to

Responses

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Guillermo E. Villanueva 2021-03-22 12:44:46 Re: Tiempo entre cambio de valores
Previous Message cDaniel GE 2021-03-20 23:13:21 Re: INSERT PHP 7