2011-03-14 130 views
7

我必須編寫一個查詢來計算每個客戶購物之間的平均天數(不使用子查詢)。Sql:日期的平均值

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天。 Alice Cooper的(!)等了7天所以她 平均爲7鮑勃·貝克是每天亞軍所以他平均爲1

我做了這樣的事情

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

,但它不工作。

任何幫助將不勝感激。

+0

這必須是家庭作業,因爲我幾天前已經看到了這個確切的問題(和日差距) - 是嗎?如果它是 – RichardTheKiwi 2011-03-14 21:27:30

+0

,我們通常會要求學術誠實和披露[SQL:查找每個跑步者之間的平均跑步天數。](http://stackoverflow.com/questions/5237141/sql-finding-the-每個跑步者的平均跑步次數) – RichardTheKiwi 2011-03-14 21:28:52

+0

是的,是的。 我查了一下,但沒有發現任何東西。謝謝! – user640072 2011-03-14 21:34:23

回答

2

PostgreSQL的版本

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

你可能想通過聲明

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

每當你在選擇列表聚集函數使用一組,你必須使用在不屬於成員的其他字段分組聚合。

這是在SQL Server上測試的,語法可能與Postgresql不同,我不使用它。鏈接答案

+0

謝謝,我之前曾嘗試過,但我在avg上得到這個錯誤「沒有函數匹配給定的名稱和參數類型,您可能需要添加顯式類型轉換。 – user640072 2011-03-14 21:27:49

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

我在avg上得到這個錯誤「沒有函數匹配給定的名稱和參數類型,您可能需要添加明確的類型轉換。」 – user640072 2011-03-14 21:29:08

3

你有你的時間戳轉換在新紀元的秒數​​使用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; 
+0

我需要在沒有時區字段的時間戳上找到AVG,然後按其他字段進行分組並按該字段進行排序,這對我也有用嗎?因爲它顯示類似「397559:45:49。20757「不確定它是如何分類的 – 2016-06-22 13:14:36

0

這在類似的情況爲我工作:

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

選擇最大/最小/計數不是平均值。嘗試:

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