Miguel Beltran R. escribió: > Hola Lista > > Tengo unos registros con un campo datetime que representan cuando se > insertaron > > ¿qué query me puede ayudar a saber el tiempo promedio entre uno y otro? > > Ej. > > valor captura > 1 2010-02-15 12:00:01 > 2 2010-02-15 12:00:03 > 3 2010-02-15 12:00:08 > > Entre el 1ro y 2do fueron 2 segundos y entre el 2do y 3ro fueron 5 segundos, > sumados son 7 segundos entre 3 registros serian un promedio de 2.33 segundos
La manera más limpia es con una función ventana. Por ej. alvherre=# create table miguel (a serial, b timestamp default now()); NOTICE: CREATE TABLE creará una secuencia implícita «miguel_a_seq» para la columna serial «miguel.a» CREATE TABLE alvherre=# insert into miguel default values; INSERT 0 1 alvherre=# insert into miguel default values; INSERT 0 1 alvherre=# insert into miguel default values; INSERT 0 1 alvherre=# insert into miguel default values; INSERT 0 1 alvherre=# insert into miguel default values; INSERT 0 1 alvherre=# insert into miguel default values; INSERT 0 1 alvherre=# insert into miguel default values; INSERT 0 1 alvherre=# select * from miguel; a | b ---+---------------------------- 1 | 2010-02-15 17:45:34.116514 2 | 2010-02-15 17:45:36.236193 3 | 2010-02-15 17:45:39.316307 4 | 2010-02-15 17:45:40.044354 5 | 2010-02-15 17:45:43.292354 6 | 2010-02-15 17:45:44.644171 7 | 2010-02-15 17:45:46.204193 (7 filas) alvherre=# select *, b - lag(b) over (order by b ROWS BETWEEN UNBOUNDED PRECEDING AND current row) from miguel; a | b | ?column? ---+----------------------------+----------------- 1 | 2010-02-15 17:45:34.116514 | 2 | 2010-02-15 17:45:36.236193 | 00:00:02.119679 3 | 2010-02-15 17:45:39.316307 | 00:00:03.080114 4 | 2010-02-15 17:45:40.044354 | 00:00:00.728047 5 | 2010-02-15 17:45:43.292354 | 00:00:03.248 6 | 2010-02-15 17:45:44.644171 | 00:00:01.351817 7 | 2010-02-15 17:45:46.204193 | 00:00:01.560022 (7 filas) A partir de ahí puedes hacer como quieras con las diferencias entre valores. Para obtener el promedio de todos esos valores; por ejemplo, alvherre=# select min(a), max(a), avg(dif) from (select a, b, b - lag(b) over (order by b ROWS BETWEEN UNBOUNDED PRECEDING AND current row ) as dif from miguel) foo; min | max | avg -----+-----+----------------- 1 | 7 | 00:00:02.014613 (1 fila) -- Alvaro Herrera Vendo parcela en Valdivia: http://rie.cl/?a=255568 "Oh, great altar of passive entertainment, bestow upon me thy discordant images at such speed as to render linear thought impossible" (Calvin a la TV) -- TIP 1: para suscribirte y desuscribirte, visita http://archives.postgresql.org/pgsql-es-ayuda
