Oracle SQL - 按主题的日期之间的平均时间

时间:2013-08-23 21:11:32

标签: sql oracle

我在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之间的平均值。

2 个答案:

答案 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;
相关问题