Sql: среднее число дат - PullRequest
7 голосов
/ 15 марта 2011

Мне нужно написать запрос, чтобы рассчитать среднее количество дней между покупками для каждого клиента (без использования подзапросов).

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

Например,

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’);

должно вернутьсячто Джон Смит ждал 1 день, затем 5 дней, поэтому его среднее значение составляет 3 дня.Алиса Купер (!) Ждала 7 дней, поэтому ее среднее значение составляет 7. Боб Бейкер - ежедневный бегун, поэтому его среднее значение составляет 1.

Я сделал что-то подобное

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

, но это не такне работает.

Любая помощь будет принята с благодарностью.

Ответы [ 6 ]

4 голосов
/ 13 марта 2015

Вы должны преобразовать свою метку времени в секундах эпохи, чтобы использовать функцию агрегирования avg:

SELECT
    customer,
    timestamp without time zone '1970-01-01' + cast(
       avg(EXTRACT(EPOCH FROM bought::timestamp)
    )::text as interval) 
FROM data
GROUP BY customer;
2 голосов
/ 06 июля 2017

выбор max-min / count НЕ является средним. попробовать:

 timestamp 'epoch' + avg(date_part(epoch, date_column))  * interval '1 second' 
2 голосов
/ 22 июня 2016

Это сработало для меня в аналогичной ситуации:

SELECT customer, avg(AGE(now(),bought)) as waited
FROM data 
GROUP BY customer
2 голосов
/ 15 марта 2011

PostgreSQL версия связанного ответа

select customer, (max(bought) - min(bought)) / (count(bought)-1)
from data
group by customer;
1 голос
/ 15 марта 2011

Возможно, вы захотите использовать оператор группировки по группам

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

Всякий раз, когда у вас есть агрегатная функция в списке выбора , вы должны использовать группировку подругие поля, которые не являются членами агрегации.

Это было проверено на SQL Server, и синтаксис может отличаться от Postgresql, который я не использую.

0 голосов
/ 15 марта 2011
SELECT customer, AVG(bought) AS average FROM data GROUP BY customer
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...