2011-03-14 25 views
7

Tengo que escribir una consulta para calcular el número promedio de días entre compras para cada cliente (sin usar subconsultas).Sql: promedio de las fechas

create table data { 
customer varchar(20) not null, 
bought date not null, 
primary key (customer,bought) 
} 

Por ejemplo,

insert into data (customer,bought) 
values (‘John Smith’, date ‘2011-02-01’), 
(‘Alice Cooper’, date ‘2011-02-01’), 
(‘Bob Baker’, date ‘2011-02-01’), 
(‘John Smith’, date ‘2011-02-02’), 
(‘Bob Baker’, date ‘2011-02-02’), 
(‘Bob Baker’, date ‘2011-02-03’), 
(‘Bob Baker’, date ‘2011-02-04’), 
(‘Bob Baker’, date ‘2011-02-05’), 
(‘Bob Baker’, date ‘2011-02-06’), 
(‘Bob Baker’, date ‘2011-02-07’), 
(‘John Smith’, date ‘2011-02-07’), 
(‘Alice Cooper’, date ‘2011-02-08’); 

debería devolver que John Smith esperó 1 día después de 5 días, por lo que su promedio es de 3 días. Alice Cooper (!) Esperó 7 días por lo que su promedio es 7. Bob Baker es un corredor al día por lo que su promedio es de 1.

he hecho algo como esto

select distinct customer, avg (bought) as average from data; 

pero no funciona .

Cualquier ayuda será muy apreciada.

+0

Esto debe ser tarea, porque he visto esta pregunta (y lagunas) hace unos días, ¿no? Normalmente pedimos honestidad académica y divulgación si es – RichardTheKiwi

+0

posible duplicado de [SQL: Encontrar la cantidad promedio de días entre ejecuciones para cada corredor.] (Http://stackoverflow.com/questions/5237141/sql-finding-the- average-number-of-days-between-runs-for-each-runners) – RichardTheKiwi

+0

Lo es, sí. Lo busqué pero no encontré nada. ¡Gracias! – user640072

Respuesta

2

versión de PostgreSQL de la respuesta ligado

select customer, (max(bought) - min(bought))/(count(bought)-1) 
from data 
group by customer; 
1

Es posible que desee utilizar un grupo por la declaración

select 
    customer, 
    datediff(D, min(bought), max(bought))/count(bought) as average 
from data 
group by customer 

Siempre que tenga una función agregada en el lista de selección, usted tiene que utilizar la agrupación de los otros campos que no son miembros de la agregación.

Esto se probó en SQL Server y la sintaxis puede diferir de Postgresql, que no estoy usando.

+0

Gracias, lo intenté antes pero recibo este error en avg "Ninguna función coincide con los tipos de argumentos y el nombre dado. Puede que necesite agregar moldes explícitos de tipo". – user640072

-3
SELECT customer, AVG(bought) AS average FROM data GROUP BY customer 
+1

Aparece este error en avg "Ninguna función coincide con el nombre de pila y los tipos de argumento. Es posible que deba agregar conversiones de tipo explícitas". – user640072

3

Usted tiene que convertir su marca de tiempo en segundos época utilizar AVG función agregada:

SELECT 
    customer, 
    timestamp without time zone '1970-01-01' + cast(
     avg(EXTRACT(EPOCH FROM bought::timestamp) 
    )::text as interval) 
FROM data 
GROUP BY customer; 
+0

Necesito encontrar AVG en una marca de tiempo sin campo de zona horaria y luego estoy agrupando por otro campo y ordenando por este campo, ¿con esto también funciona para mí? Como muestra algo así como "397559: 45: 49.20757 "no estoy seguro de cómo se clasifica esto –

0

Esto funcionó para mí en situación similar:

SELECT customer, avg(AGE(now(),bought)) as waited 
FROM data 
GROUP BY customer 
0

seleccionar max-min/count NO es el promedio. Prueba:

timestamp 'epoch' + avg(date_part(epoch, date_column)) * interval '1 second'