2013-08-23 127 views
0

我正在使用Oracle SQL。我有一張帶有ID和日期的表格,我試圖按主題查找日期之間的平均時間。它看起來像這樣。Oracle SQL - 日期之間的平均時間按主題

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。

回答

4

平均實際上是最小值和最大值之間的差值,比計數值小1。

爲您的數據:

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 
+0

啊,比我的方法好多了。 –

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;