我在Oracle SQL中工作。我有一张带有ID和日期的表格,我试图按主题查找日期之间的平均时间。它看起来像这样。
表
SubjectID Date
1 8/01/2013 12:00:00 AM
1 8/31/2013 12:00:00 AM
1 9/10/2013 12:00:00 AM
2 1/01/2010 12:00:00 AM
2 1/21/2010 12:00:00 AM
我需要编写一个通过SubjectID遍历该表的查询,记录日期之间的时间,并输出平均值的平均值,可以这么说。在这个例子中,它将是第一行和第二行(30天)之间的时间+第二行和第三行(10天)/ 2之间的时间(以获得主题1的平均值,即= 20),然后是第4行和第5行(20天)/ 1之间的时间(得到主题2的平均值),输出应该是那些(20 + 10)/ 2 = 15之间的平均值。
答案 0 :(得分:4)
平均值实际上是最小值和最大值之间的差值,除以小于计数值的一个。
对于您的数据:
select SubjectId,
(case when count(*) > 1
then (max(date) - min(date))/(count(*) - 1)
end) as AvgDifference
from t
group by SubjectId;
要获得总体平均值,请使用子查询:
select avg(AvgDifference)
from (select SubjectId,
(case when count(*) > 1
then (max(date) - min(date))/(count(*) - 1)
end) as AvgDifference
from t
group by SubjectId
) t
答案 1 :(得分:0)
首先获取行之间的持续时间:
select subjectid,
date,
date - lag(date) over (partition by subjectid order by date) as diff
from the_table;
然后得到每个subjectid的平均差异:
select subjectid,
avg(diff)
from (
select subjectid,
date,
date - lag(date) over (partition by subjectid order by date) as diff
from the_table
) t
group by subjectid
order by subjectid;