2010-11-30 66 views
18

之間的平均間隔假設這個表:MySQL的:記錄

id date 
---------------- 
1  2010-12-12 
2  2010-12-13 
3  2010-12-18 
4  2010-12-22 
5  2010-12-23 

我如何找到這些日期之間的間隔平均使用MySQL只查詢?

例如,在此表中的計算將是

(
    (2010-12-13 - 2010-12-12) 
    + (2010-12-18 - 2010-12-13) 
    + (2010-12-22 - 2010-12-18) 
    + (2010-12-23 - 2010-12-22) 
)/4 
---------------------------------- 
= (1 DAY + 5 DAY + 4 DAY + 1 DAY)/4 
= 2.75 DAY 
+2

如果不在SQL中執行此操作,這將更容易。爲什麼你需要在SQL中完成? – jwueller 2010-11-30 09:07:37

+1

因爲聽起來很有趣。我已經用我的PHP函數實現了這個。但我很好奇,看看MySQL是否可以在沒有顯着性能影響的情況下完成。 – HyderA 2010-11-30 09:10:59

+0

首先你需要計算2行之間的差異看看:http://stackoverflow.com/questions/3017468 – 2010-11-30 09:14:18

回答

35

直覺,你問應相當於第一個和最後日期之間的間隔,按日期數減1

分讓我來解釋更徹底。想象中的日期是上線的點(+存在日期,-是日期缺失,第一日期是12日,我改變了最後日期12月24日用於說明目的):

++----+---+-+ 

現在,你真的想這樣做,是均勻地間隔開日期這些線之間,並且發現這是他們每個人之間有多長:

+--+--+--+--+ 

要做到這一點,你乾脆把最後和第一之間的天數天,在這種情況下,24 - 12 = 12,併除以你必須隔開的間隔數,在這種情況下4:12/4 = 3

隨着MySQL查詢

SELECT DATEDIFF(MAX(dt), MIN(dt))/(COUNT(dt) - 1) FROM a; 

此作品在此表(與你的價值觀,它返回2。75):

CREATE TABLE IF NOT EXISTS `a` (
    `dt` date NOT NULL 
) ENGINE=MyISAM DEFAULT CHARSET=latin1; 

INSERT INTO `a` (`dt`) VALUES 
('2010-12-12'), 
('2010-12-13'), 
('2010-12-18'), 
('2010-12-22'), 
('2010-12-24'); 
0

你需要做自連接,讓使用DATEDIFF函數的差異,並得到平均。

2

如果ID無間隙均勻地遞增,加入表本身的ID + 1:

SELECT d.id, d.date, n.date, datediff(d.date, n.date) 
FROM dates d 
JOIN dates n ON(n.id = d.id + 1) 

然後GROUP BY和平均需要。

如果ID不統一,請先執行內部查詢以分配有序的ID。

我想你還需要添加一個子查詢來獲得總行數。

或者

創建聚合功能,用於跟蹤以前的日期,並且運行總和和計數。您仍然需要從子查詢中進行選擇以強制按日期排序(實際上,我不確定在MySQL中是否保證了這一點)。

想想吧,這是一個更好的方法。

而且更加容易

就指出,維加德的解決方案要好得多。

1

下面的查詢返回正確的結果

SELECT AVG(
     DATEDIFF(i.date, (SELECT MAX(date) 
          FROM intervals WHERE date < i.date) 
       ) 
      ) 
FROM intervals i 

但它運行一個子查詢相關,這可能是沒有索引和行數量較多真的效率低下。